2016-03-21 5 views
1

Ich habe die folgende Sammlung:MongoDB: Return Objekte in einem verschachtelten Array, das die jüngste Datum hat

{ 
    "_id" : ObjectId("56f036e032ea1f27634e2f1f"), 
    "mockups" : [ 
     { 
      "versions" : [ 
       { 
        "title" : "About us 1", 
        "timestamp" : "2016-01-10T12:31:23.104Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17922") 
       }, 
       { 
        "title" : "About us 3", 
        "timestamp" : "2016-03-11T15:34:11.108Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17923") 
       }, 
       { 
        "title" : "About us 2", 
        "timestamp" : "2016-02-21T16:15:23.101Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17924") 
       } 
      ], 
      "_id" : ObjectId("56ec65a9041c87dd6bd17921") 
     }, 
     { 
      "versions" : [ 
       { 
        "title" : "Contact us 1", 
        "timestamp" : "2016-04-10T11:34:33.103Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17924") 
       }, 
       { 
        "title" : "Contact us 3", 
        "timestamp" : "2016-06-21T16:13:26.101Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17926") 
       }, 
       { 
        "title" : "Contact us 2", 
        "timestamp" : "2016-05-11T13:34:13.106Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17925") 
       } 
      ], 
      "_id" : ObjectId("56ec65a9041c87dd6bd17929") 
     } 
    ] 
} 

ich alle mockups mit der neuesten version zurückkehren möchten, die in etwas ähnlich dem folgenden führen würde:

{ 
    "_id" : ObjectId("56f036e032ea1f27634e2f1f"), 
    "mockups" : [ 
     { 
      "versions" : [ 
       { 
        "title" : "About us 3", 
        "timestamp" : "2016-03-11T15:34:11.108Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17923") 
       } 
      ], 
      "_id" : ObjectId("56ec65a9041c87dd6bd17921") 
     }, 
     { 
      "versions" : [ 
       { 
        "title" : "Contact us 3", 
        "timestamp" : "2016-06-21T16:13:26.101Z", 
        "_id" : ObjectId("56ec65a9041c87dd6bd17926") 
       } 
      ], 
      "_id" : ObjectId("56ec65a9041c87dd6bd17929") 
     } 
    ] 
} 

ich habe mit aggregate, spielen sort und limit, aber ich bin sehr neu für MongoDB. Ich bin im Moment damit, dass ich einfach alles zurückgeben und etwas wie lodash verwenden muss, um die Version zu bekommen, die ich brauche.

Gibt es eine Möglichkeit, dies richtig abzufragen, so dass ich die Ergebnisse, die ich brauche, aus dem Mongo im Gegensatz zu etwas wie lodash bekommen, nachdem ich die Ergebnisse zurückbekomme?

Antwort

0

Für eine Lösung Aggregation verwenden, würde vorschlagen, die folgende Pipeline läuft die gewünschte Ausgabe zu erhalten:

db.collection.aggregate([ 
    { "$unwind": "$mockups" }, 
    { "$unwind": "$mockups.versions" }, 
    { "$sort": { "mockups.versions.timestamp": -1 } }, 
    { 
     "$group": { 
      "_id": "$mockups._id",       
      "title": { "$first": "$mockups.versions.title" }, 
      "timestamp": { "$first": "$mockups.versions.timestamp" }, 
      "id" : { "$first": "$mockups.versions._id" }, 
      "main_id": { "$first": "$_id" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "versions": { 
       "$push": { 
        "title": "$title", 
        "timestamp": "$timestamp", 
        "_id": "$id" 
       }   
      }, 
      "main_id": { "$first": "$main_id" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$main_id", 
      "mockups": { 
       "$push": { 
        "versions": "$versions",      
        "_id": "$_id" 
       }   
      }   
     } 
    }  
]) 
0

ich eigentlich nicht verstanden, was der Bereich für „neueste“ Version, aber ich denke, Sie etwas wie folgt verwenden können: Beispiel:

db.collection.find({ 
    versions.timestamp: { 
     $gte: ISODate("2010-04-29T00:00:00.000Z"), 
     $lt: ISODate("2010-05-01T00:00:00.000Z") 
    } 
}) 

, wenn Sie die aggregate Sie können verwenden möchten Setzen Sie diese Bedingung in die $match.

Verwandte Themen