1

Ich habe folgende Daten. Ich möchte die mongodb-Aggregatfunktion verwenden, um Lieferanten und Kunden aus den unten gezeigten Daten zu extrahieren. Ich möchte bestimmte Felder projizieren und restliche Felder aus den Ausgabedaten entfernen.Verschachtelte Array-Aggregationsabfrage in mongodb mit projizierten Dateien?

{ 
     "_id" : ObjectId("577f9a25bea25d480d8f1895"), 
     "password" : "12345", 
     "mobile" : "9582223889", 
     "email" : "[email protected]", 
     "name" : "ashiush jindal", 
     "invoice" : [{ 
      "name" : "Ashish Jindal", 
      "dname" : "jindalbe", 
      "email" : "[email protected]", 
      "password" : "12345", 
      "role" : ["customer"] 
      }], 
     "inventory" : [{ }, { 
      "item" : "Levis Jeans", 
      "sku" : "12345", 
      "buy" : [{ 
       "bp" : "jindalbe", 
       "qty" : 50, 
       "created" : "9/7/2016" 
       }] 
      }, { 
      "item" : "Levis Trouser", 
      "sku" : "123", 
      "selling_price" : 2000, 
      "buy" : [{ 
       "bp" : "jindalbe", 
       "qty" : 90, 
       "created" : "9/7/2016", 
       "price_per_qty" : 1000 
       }, { 
       "bp" : "jindalbe", 
       "qty" : 60, 
       "created" : "9/7/2016", 
       "price_per_qty" : 1000 
       }, { 
       "bp" : "jindalbe", 
       "qty" : 60, 
       "created" : "9/7/2016", 
       "price_per_qty" : 1000 
       }, { 
       "bp" : "jindalbe", 
       "qty" : 60, 
       "created" : "9/7/2016", 
       "price_per_qty" : 1000 
       }, { 
       "bp" : "jindalbe", 
       "qty" : 60, 
       "created" : "9/7/2016", 
       "price_per_qty" : 5000 
       }, null] 
      }], 
     "business_partner" : [{ 
      "name" : "Ashish Jindal", 
      "dname" : "jindalbe", 
      "email" : "[email protected]", 
      "password" : "12345", 
      "role" : ["customer"] 
      }, { 
      "name" : "Ashish Jindal", 
      "dname" : "jindalbe", 
      "email" : "[email protected]", 
      "password" : "12345", 
      "role" : ["customer"] 
      }, { 
      "name" : "Ashish Kumar", 
      "dname" : "jindal", 
      "email" : "[email protected]", 
      "password" : "12345", 
      "role" : ["supplier"] 
      }], 
     "__v" : 0 
     } 

Ich möchte alle Geschäftspartner Namen, die auch Lieferanten sind extrahieren.

In dem Formular unten gezeigt.

{ 
    suppliers:["Ashish Kumar"] 
} 

Ich möchte es mit Aggregation Abfrage verwenden.

Die Lösung, die ich ausprobiert habe, ist.

  [ 
       { $match: { "_id": ObjectId(req.headers["token"]) } },{ 
        $project: { 
         suppliers: { 
          $filter: { 
           input: '$business_partner.role', 
           as: 'role', 
           cond: {"$eq":["$$bp.role","supplier"]} 
          } 
         }, 
         _id: 0 
        } 
       } 
      ]; 

Antwort

0

können Sie Ihre Arrays $unwind und $match Bedingungen verwenden. Verwenden Sie dann $addToSet, um alle Ihre Lieferanten zu einem einzigen Array hinzuzufügen. Es wird für jeden _id kein Anbieter duplizieren sein:

db.device.aggregate([{ 
    "$unwind": "$business_partner" 
}, { 
    "$unwind": "$business_partner.role" 
}, { 
    "$match": { 
    "_id": ObjectId("577f9a25bea25d480d8f1895"), 
    "business_partner.role": "supplier" 
    } 
}, { 
    "$project": { 
    "_id": 1, 
    "business_partner": 1 
    } 
},{ 
    "$group": { 
     _id:"$_id", 
     supplier: { 
      $addToSet: '$business_partner' 
     } 
    } 
}]); 

Dies ist kompatibel mit Mongo 2,6 (wo es keine $filter)

Es wird Ihnen diese Art der Ausgabe:

{ 
    "_id": ObjectId("577f9a25bea25d480d8f1895"), 
    "supplier": [{ 
    "name": "Ashish Kumar", 
    "dname": "jindal", 
    "email": "[email protected]", 
    "password": "12345", 
    "role": "supplier" 
    }] 
} 
+0

Will Es gibt ein Array wie Lieferanten zurück: [] –

+0

Ich habe meinen Beitrag aktualisiert, indem ich einen '$ addToSet' hinzugefügt habe, um jeden Lieferanten für eine gegebene' _id' an ein einzelnes Array mit dem Namen 'supplier' ohne Duplikate zu schicken –

+0

Vielen Dank @ bertrand :-) –

Verwandte Themen