1

Ich muss mongodb Abfrage schreiben, die Elemente von Quantinty (Aufträge collestion) aggregieren wird. Nach agregation oder mit agregation, sollte es Elemente identifizieren, und den Namen der Person zurückkehren kann nicht auf Lager Sammlung zugeführt werden, die diese Reihenfolge MongoDB Aggregation und Vergleich

Code von Aufträgen

db.orders.insertMany([ 
{client: {firstName: "John",lastName: "Smith" },orderedItems: [{ name: "itemA", qty: 5},{ name: "itemS", qty: 3}]}, 
{client: {firstName: "Jan",lastName: "Nowak" },orderedItems: [{ name: "itemA", qty: 56},{ name: "itemS", qty: 53}]}, 
{client: {firstName: "Klara",lastName: "Bolączka" },orderedItems: [{ name: "itemA", qty: 35},{ name: "itemS", qty: 23}]}, 
{client: {firstName: "Brajan",lastName: "Kowalski" },orderedItems: [{ name: "itemA", qty: 95},{ name: "itemS", qty: 13}]} 
]); 

Code der Aktien einfügen

gemacht einfügen

db.stock.insertMany([ 
{ item: "itemA", qty: 40}, 
{ item: "itemS", qty: 113} 
]); 

gerade jetzt ich einige mongoDB Code bekam, dass agregates nur Befehle

db.orders.aggregate([ 
{$unwind: "$orderedItems"}, 
{$group: { _id: "$orderedItems.name", total:{$sum: "$orderedItems.qty"}}} 
]); 

Ich habe versucht, Lookup zu verwenden, aber wahrscheinlich mache ich etwas falsch.

Könnte ich bitte ein paar Anregungen bekommen?

+0

Ich würde sagen, das erste, was Sie falsch machen, vollständig jeden Versuch von der Frage bei Nutzung ist das Weglassen Sie fragen. Es ist uns egal, wenn Sie falsch liegen, aber nur darauf achten, dass Sie es tatsächlich versucht haben. Scheint mir das "localField" in der "orders" 'Sammlung ist" "orderedItems.name" '. Von wo ich stehe, wenn du tatsächlich etwas versucht hast, dann gibt es eine spezifische Frage, die du stellen kannst. Aber das ist nicht die Frage, die du hier stellst, und alles, was ich sehe, ist "bitte tu es für mich". Gerne helfen Sie, den Teil zu erklären, den Sie nicht verstehen, wenn Sie ihn identifizieren. –

+0

Es tut mir so leid, dass ich mir die Zeit genommen habe ... Ich habe es versucht und eine Aussage mit $ lookup geschrieben, aber es bearbeitet, weil es doof ist ... Ich fühle mich körperlich nicht gut, habe fast ständig Kopfschmerzen. Ich versuche es wirklich, aber Sie wissen ... db.orders.aggregate ([ {$ Projekt: {_id: 0, Client: 1, bestellte Artikel: 1}}, {$ unwind: "$ orderedItems"} , {$ group: {_id: "$ orderedItems.name", gesamt: {$ sum: "$ orderedItems.qty"}}}, {$ lookup: {von: "stock", localField: 'orderedItems.name ', foreignField: "item", wie: "a"}}, {$ match: {"a": {$ ne: []}}} ]); –

+0

Es gibt keine "versuchen" [in Ihrer Frage] (https://stackoverflow.com/posts/47337188/edit). Sie ** brauchen **, um uns tatsächlich zu zeigen, was Sie versuchten. Sie müssen auch auf die ziemlich klare Anweisung im Kommentar achten, die Ihnen im Grunde zeigt, was der allererste Schritt ist. Fragen, die "Gimmie die Codes" stellen, sind Grund für die Schließung hier. Zeigen Sie etwas Mühe, es tatsächlich zu lösen, und Sie werden irgendwo hinkommen. –

Antwort

0

Wie würden Sie so etwas wie dies mag:

db.orders.aggregate([ 
{ 
    $unwind: "$orderedItems" // flatten the "orderedItems" array 
}, 
{ 
    $group: { 
     "_id": "$orderedItems.name", // group by orderItems.name 
     "total": { 
      $sum: "$orderedItems.qty" // calculate total quantity 
     }, 
     "users": { 
      $addToSet: "$client" // create an array of clients who have ordered each item 
     } 
    } 
}, { 
    $lookup: { // retrieve the stock information 
     from: "stock", 
     localField: "_id", 
     foreignField: "item", 
     as: "stock" 
    } 
}, { 
    $unwind: "$stock" // flatten the result array - should always return only one document, given your data model 
}, { 
    $addFields: { // add a new field... 
     "difference": { // ...called "difference"... 
      $subtract: [ "$stock.qty", "$total" ] // ...in which we store the difference between the stock qty and the ordered qty 
     } 
    } 
}, { 
    $match: { // only return documents... 
     "difference": { // ...where the value for "difference"... 
      $lt: 0 // ...is less than zero 
     } 
    } 
}])