2017-07-25 2 views
0

Ich habe das folgende Objekt und möchte alle Datensätze, die ein Schlüsselwort und DeviceID hat.Mongo :. Wie bekomme ich eindeutige Zeilen

Es könnte mehrere Objekte mit derselben Geräte-ID geben. Ich würde für jedes Device ID letzten Eintrag wie

{ 
    search:{ 
    keyword:"_" 
    }, 
    dateCreated:"", 
    device:[{ 
    deviceID:"_" 
    }], 

} 

Beispiel

{ 
    search:{ 
    keyword:"FL" 
    }, 
    dateCreated:"01/01/2017", 
    device:[{ 
    deviceID:"1" 
    }], 

} 

{ 
    search:{ 
    keyword:"ATL" 
    }, 
    dateCreated:"01/02/2017", 
    device:[{ 
    deviceID:"1" 
    }], 

} 
{ 
    search:{ 
    keyword:"GA" 
    }, 
    dateCreated:"01/03/2017", 
    device:[{ 
    deviceID:"2" 
    }], 

} 

Die Abfrage kann

{ 
    search:{ 
    keyword:"ATL" 
    }, 
    dateCreated:"01/02/2017", 
    device:[{ 
    deviceID:"1" 
    }], 

} 
{ 
    search:{ 
    keyword:"GA" 
    }, 
    dateCreated:"01/03/2017", 
    device:[{ 
    deviceID:"2" 
    }], 

} 
+0

'' ' device: [{deviceID: "2"}], '' 'Warum speichern Sie DeviceID in einem Array von Geräten? – styopdev

Antwort

0

Sie können nicht erreichen, dass "dateCreated", zuerst müssen Sie "dateCreated" Spalte in Datumsform zu konvertieren (im Zusammenhang mit dem Mondo-ISO-Datum). Danach können Sie zum Erreichen des letzten Eintrag folgende laufen, wie in Ihrer Frage erwähnt

db.abc.aggregate([ 
{ 
"$unwind": "$device" 
}, 
{$group: { 
    _id: "$device", 
    search: { 
    "$max": "$search" 
    }, 
    dateCreated: { 
    "$max": "$dateCreated" 
    } 
} 
} 
]) 

und wenn Sie für das gleiche Json-Format suchen, dann können Sie diese Abfrage projizieren,

db.abc.aggregate([ 
    { 
    "$unwind": "$device" 
    }, 
    { 
    $group: { 
     _id: "$device", 
     device: { 
     "$push": "$device" 
     }, 
     search: { 
     "$max": "$search" 
     }, 
     dateCreated: { 
     "$max": "$dateCreated" 
     } 
    } 
    }, 
    { 
    $project: { 
     search: 1, 
     dateCreated: 1, 
     device: 1, 
     _id: 0 
    } 
    } 
]) 
0

Gebrauch verwenden $elemMatch zurückkehren sollte:

db.collection.find({device: {$elemMatch: {deviceID:'1')}}); 

Mitkönnen Sie mehr als eine Komponente innerhalb desselben Array-Elements zuordnen.

mehr lesen here

0

iam nicht genau verstehen, was Sie meinen, aber hier iam eine Lösung geben, was ich es verstanden überprüfen einmal

db.collection.aggregate([ 
{$group:{_id:"$search.keyword",dateCreated:{$last:"$dateCreated"},device:{$last:"$device"}}},{$match:{"device.deviceID":{$ne:null}}} 
]) 

hier iam Gruppierung nach Suchbegriff ein, wenn Sie Sie gruppieren können möchten, indem Sie beide suchen Schlüsselwort und Gerät und einschließlich letztes Gerät mit $ last und schließlich übereinstimmendes Gerät nicht gleich Null

Verwandte Themen