2017-11-28 2 views
2

Ich habe eine unter Struktur in einer Beispielkollektion verwaltet.MongoDB-Filter für bestimmte Daten in Array und nur bestimmte Felder in der Ausgabe

{ 
    "_id": "1", 
    "name": "Stock1", 
    "description": "Test Stock", 
    "lines": [ 
    { 
     "lineNumber": "1", 
     "priceInfo": { 
     "buyprice": 10, 
     "sellprice": 15 
     }, 
     "item": { 
     "id": "BAT10001", 
     "name": "CricketBat", 
     "description": "Cricket bat" 
     }, 
     "quantity": 10 
    }, 
    { 
     "lineNumber": "2", 
     "priceInfo": { 
     "buyprice": 10, 
     "sellprice": 15 
     }, 
     "item": { 
     "id": "BAT10002", 
     "name": "CricketBall", 
     "description": "Cricket ball" 
     }, 
     "quantity": 10 
    }, 
    { 
     "lineNumber": "3", 
     "priceInfo": { 
     "buyprice": 10, 
     "sellprice": 15 
     }, 
     "item": { 
     "id": "BAT10003", 
     "name": "CricketStumps", 
     "description": "Cricket stumps" 
     }, 
     "quantity": 10 
    } 
    ] 
} 

ich ein Szenario, wo ich lineNumber und item.id gegeben wird, muss ich die obige Sammlung filtern, basierend auf lineNumber und item.id und ich brauche nur ausgewählte Felder zu projizieren.

Erwartete Ausgabe unter:

{ 
    "_id": "1", 
    "lines": [ 
    { 
     "lineNumber": "1", 
     "item": { 
     "id": "BAT10001", 
     "name": "CricketBat", 
     "description": "Cricket bat" 
     }, 
     "quantity": 10 
    } 
    ] 
} 

Hinweis: ich nicht lineNumber alle Zeiten erhalten kann, wenn lineNumber null ist, dann sollte ich allein für item.id filtern und erhalten die oben output.The Hauptzweck erwähnt ist um die Anzahl der Felder in der Ausgabe zu reduzieren, da erwartet wird, dass die Sammlung eine große Anzahl von Feldern enthält.

habe ich versucht, die unter Abfrage,

db.sample.aggregate([ 
{ "$match" : { "_id" : "1"} , 
{ "$project" : { "lines" : { "$filter" : { "input" : "$lines" , "as" : "line" , "cond" : 
    { "$and" : [ { "$eq" : [ "$$line.lineNumber" , "3"]} , { "$eq" : [ "$$line.item.id" , "BAT10001"]}]}}}}} 
]) 

Aber ich habe alle Felder, ich bin die erforderlichen Felder nicht in der Lage auszuschließen oder zu schließen.

Antwort

2

Sie können es erreichen mit $unwind und $group Aggregationsstufen:

db.collection.aggregate([ 
    {$match: {"_id": "1"}}, 
    {$unwind: "$lines"}, 
    {$match: { 
     $or: [ 
      {"lines.lineNumber":{$exists: true, $eq: "1"}}, 
      {"item.id": "BAT10001"} 
     ] 
    }}, 
    {$group: { 
     _id: "$_id", 
     lines: { $push: { 
      "lineNumber": "$lines.lineNumber", 
      "item": "$lines.item", 
      "quantity": "$lines.quantity" 
     }} 
    }} 
]) 
  • $match - legt die Kriterien für die Filter Dokumente. Die erste Stufe dauert Dokument mit _id = "1", die zweite nimmt nur Dokumente, die lines.lineNumber gleich "1" oder item.id gleich "BAT10001" haben.
  • $unwind - teilt das lines Array in separate Dokumente auf.
  • $group - verschmilzt die Dokumente durch das _id Element und legt das erzeugte Objekt mit lineNumber, item und quantity Elemente in die lines Array.
+0

ich die obige Abfrage versucht, es nicht für die Zeilennummer Matching arbeitet, ist es, alle Zeilennummern bringt obwohl ich die Zeilennummer zur Verfügung stellen als 1 – vasantharajan

+0

Können Sie mir eine Beispieldaten und Ihre Abfrage, die fehlgeschlagen ist, zur Verfügung stellen? Da die aktuelle Abfrage ordnungsgemäß mit den Beispieldaten aus der Frage funktioniert. Oder vielleicht verstehe ich nicht, was Sie wollen :( – Neodan

+0

@vasantharajan Ich aktualisierte meine Antwort, ich hoffe, es wird helfen, besser zu verstehen, was diese Abfrage tut. – Neodan

2

habe ich versucht, die unter Abfrage und es für mich gearbeitet,

db.Collection.aggregate([ 
{ "$match" : { "_id" : "1" }} , 
{ "$project" : { "lines" : { "$map" : 
     { "input" : { "$filter" : { "input" : "$lines" , "as" : "line" , 
     "cond" : { "$and" : [ 
        { "$eq" : [ "$$line.lineNumber" , "3"]} , 
        { "$eq" : [ "$$line.item.id" , "BAT10001"]}]}}}}} , 
    "as" : "line" , 
    "in" : { "lineNumber" : "$$line.lineNumber" , 
      "item" : "$$line.item" , 
      "quantity" : "$$line.quantity" 
     } 
}} 
]) 
Verwandte Themen