2017-02-23 4 views
1

Ich werde versuchen, mit Beispieldaten zu erklären. Ein Benutzer kann eine beliebige Anzahl von Bewertungen erstellen, aber ich möchte nur die neueste von einem Rezensenten zurückgeben.Finden Sie alle Dokumente, aber wenn einige Dokumente denselben Wert haben, erhalten Sie die neueste

{ 
    id : 1 
    name : "John", 
    review : "only one review" 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    id : 3 
    name : "Sam" 
    review : "second entered" 
    dateCreated : 2017-02-23 02:41:42.300Z 
} 
{ 
    id : 2 
    name : "Sam", 
    review : "fist enterd" 
    dateCreated : 2017-02-23 02:36:32.150Z 
} 

A .find() sollte die Dokumentation mit der ID 1 und ID zurückkehren 3. Da es von John und die mit ID 3 war der letzte, hergestellt von Sam nur einen gemacht ist.

Gibt es eine Abfrage dafür?

Mein aktuelles Projekt ist schwieriger, weil ich anstelle von name habe ich userId und anonId. Diese Felder haben Werte, die Objekte Ids sind. Der komplizierteste Teil ist, dass ein Dokument nicht beides enthält. Entweder enthält es eine userId oder eine anonId

Also ich denke, ich würde eine oder Bedingung zu vielleicht brauchen. anonId oder userId

vielleicht können Sie mir auch darüber Ideen geben.

EDIT:

meine aktuellen Daten sieht wie folgt aus mehr. Es ist komplizierter.

{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : review made by an anoymous user 
    dateCreated : 2017-02-23 02:35:11.420Z 
} 
{ 
    anonId : ObjectId("58ae4f934a7d2b2490e8f99c") 
    review : second review made by anonymous user 
    dateCreated : 2017-02-23 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : first review made by authenticated user 
    dateCreated : 2017-02-22 05:35:11.420Z 
} 
{ 
    userId : ObjectId("58ae4a5f4a7d2b2490e8f996") 
    review : second review made by authenticated user 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

{ 
    userId : ObjectId("58ae5fc7a467cf23947833c8") 
    review : This will be returened because no other review has this userID 
    dateCreated : 2017-02-25 05:35:11.420Z 
} 

Antwort

1

Sie können eine ausführen absteigend $sort auf dateCreated und $group von userId oder anonId:

db.test.aggregate([{ 
    $sort: { 
     "dateCreated": -1 
    } 
}, { 
    $project: { 
     ref: { 
      $cond: { 
       if: { $gt: ["$userId", null] }, 
       then: "$userId", 
       else: "$anonId" 
      } 
     }, 
     document: "$$ROOT" 
    } 
}, { 
    $group: { 
     _id: "$ref", 
     document: { 
      "$first": "$document" 
     } 
    } 
}]) 

Beachten Sie, dass die in der $project Stufe verwendeten Zustand ist zu prüfen, ob userId existieren gesetzt sonst ref-anonId

Here ist ein Kern

+0

gut sagen wir haben 20 Felder/Pfade. Ich sollte die erste für alle von ihnen bekommen –

+0

Ich habe aktualisiert mit Ihrem realen Anwendungsfall (mit 'userId' und' anonId') und mit '$$ ROOT' als ein verschachteltes Dokument um alle Ihre Felder zu kümmern –

+0

Ich denke das macht das Auffüllen der 'userId'' anonId'-Felder schwieriger. kann ich danach bevölkern? Danke für deine Antwort. –

Verwandte Themen