2017-03-16 3 views
0

Ich bin neu zu Mongo/Mungo (mit Version 3.4.0), und ich möchte eine Abfrage schreiben, die eine Teilmenge eines Dokuments JSON-Array, die ein bestimmtes Kriterium entspricht zurückgibt. Mein Dokumentmodell enthält ein Array von JSON, und ich möchte, dass die Abfrage nur die Datensätze in dem Array zurückgibt, in dem eine Übereinstimmung auftritt, und nur bestimmte Felder. HierMongoose-Abfrage verschachtelte JSON-Array, zurückgewählte Felder

ist ein Beispiel Schema:

Var testSchema = Schema({ 
    name: { type: String }, 
    bag: { type: Array} // JSON row data, containing fields name, phone, etc... 
}); 

Beispieldaten:

name: "alpha", 
bag: [ 
    { item:"apple", color:"red", size:"small"}, 
    { item:"pear", color:"white", size:"small"}, 
    { item:"apple", color:"green", size:"large"} 
] 

name: "beta", 
bag: [ 
    { item:"apple", color:"brown", size:"small"}, 
    { item:"pear", color:"white", size:"small"}, 
    { item:"apple", color:"green", size:"medium"} 
] 

Oder

db.tests.insert({name:'alpha', bag:[{ item:'apple', color:'red', size:'small'},{ item:'pear', color:'white', size:'small'},{ item:'apple', color:'green', size:'large'}]}) 
db.tests.insert({name:'beta', bag:[{ item:'apple', color:'brown', size:'small'},{ item:'pear', color:'white', size:'small'},{ item:'apple', color:'green', size:'medium'}]}) 

Ich mag wäre in der Lage sein, diese Daten abzufragen, sondern nur kehren die "bag" -Daten, die dem Abfrageartikel "apple" entsprechen und nur die Felder "item" und "color" aus "bag" zurückgeben.

Name: "alpha", bag: [{ item: "apple", color: "red" }, { item: "apple", color: "green" }] 
Name: "beta", bag: [{ item: "apple", color: "brown" }, { item: "apple", color: "green" }] 

Ich habe versucht, mit Spiel und Projekt mit Aggregate:

db.tests.aggregate([ 
    {"$match":{"bag.item":"apple"}}, 
    {"$project":{ 
     "Bag.item":{ 
      "$filter":{ 
      "input":"$bag", 
      "As":"bag", 
      "cond":{"$eq":["$$bag.item", "apple"]} 
     }}, 
     "Bag.color":1 
    }}]); 

Aber das gibt das Farbfeld für alle Elemente, nicht nur Äpfel und gibt immer noch die Größe Feld.

Mongodb Trying to get selected fields to return from aggregate

Retrieve only the queried element in an object array in MongoDB collection

aber immer noch nicht herausgefunden, wie die Elemente in der verschachtelten JSON-Array zu begrenzen:

Ich habe diese gesehen.

+0

was ist ihre mongodb server version? – Veeram

+0

db.version() ist 3.4.0 – J21042

Antwort

1

Sie können unter Aggregation für Version 3.4 versuchen. $addFields überschreiben Sie das vorhandene Feld bag mit gefilterten Array gefolgt von $project mit Ausschluss zum size Feld fallen.

db.tests.aggregate([ 
    {"$match":{"bag.item":"apple"}}, 
    {"$addFields":{ 
     "bag":{ 
      "$filter":{ 
      "input":"$bag", 
      "as":"result", 
      "cond":{"$eq":["$$result.item", "apple"]} 
     }} 
    }}, 
    {"$project":{"bag.size":0}} 
]); 
+0

Super, danke! – J21042