0

Ich habe sehr verschachtelte mongodb Menge von Objekten, also meine Sammlung:Abwickler nur, wenn Embedded existieren

{ 
    "_id":17846384es, 
    "company_name":"company1", 
    "company_location":"city1", 
    "phone":"xxxxx", 
    "open_time":"xxx", 
    "products":[ 
     { 
     "product_id":"123785", 
     "product_name":"product1", 
     "user_votes":[ 
       { 
       "user_id":1, 
        "vote":1 
       }, 
       { 
       "user_id":2, 
        "vote":2 
       } 
      ] 
     }, 
     { 
     "product_id":"98765", 
     "product_name":"product2", 
     "user_votes":[ 
       { 
       "user_id":5, 
        "vote":3 
       }, 
       { 
       "user_id":3, 
        "vote":3 
       } 
      ] 
     } 
    ] 
} 

ich auf diesem Unter von Dokumenten eine Operation wie Art und Summe verwendet, so verwendet i

db.products.aggregate([ 
    { $unwind: "$products" }, 
    { $project: { 
     company_name: 1, 
     products: { 
      product_id: 1, 
      product_name: 1, 
      user_votes: 1, 
      votes: { $sum: "$products.user_votes.vote" } 
     } 
    } }, 
    { $sort: { totalVotes: -1 } }, 
    { 
     $group: { 
      _id: "$_id", 
      company_name: { $first: "$company_name" }, 
      products: { $push: "$products" } 
     } 
    } 
]) 

dieses Ergebnis zu erhalten:

{ 
    "_id":17846384es, 
    "company_name":"company1", 
    "products":[ 
     { 
     "product_id":"98765", 
     "product_name":"product2", 
     "user_votes":[ 
       { 
       "user_id":5, 
        "vote":3 
       }, 
       { 
       "user_id":3, 
        "vote":3 
       } 
      ] 
     "votes":6 
     }, 
     { 
     "product_id":"123785", 
     "product_name":"product1", 
     "user_votes":[ 
       { 
       "user_id":1, 
        "vote":1 
       }, 
       { 
       "user_id":2, 
        "vote":2 
       } 
      ], 
      "votes":3 
     } 
    ] 
} 

aber wenn Produkt Dokument dosen't existiere ich ein leeres Ergebnis haben. Ich möchte ein Ergebnis mit Unternehmensinformationen erhalten, auch wenn das Produktdokument nicht existiert.

Antwort

1

Erstens können Sie "preserveNullAndEmptyArrays" verwenden, um die Firma zu erhalten, die kein Produkt-Array hat.

Die folgende Abfrage sollte die Firmennamen auch dann ausgeben, wenn sie kein Produkt-Array hat.

Ich denke, Sie versuchen, die Stimmen zu summieren und das Produkt-Array zu sortieren, um die höchste Anzahl von Produkten als erstes Element im Array zu erhalten. Die folgende Abfrage sollte das Ergebnis liefern.

db.product.aggregate([ 
    { $unwind: { path : "$products", preserveNullAndEmptyArrays : true }}, 
    { $project: { 
     company_name: 1, 
     products : { $ifNull : ["$products", "0"]}}    
    }, 
    { $project: { 
     company_name: 1, 
     products: { 
      product_id: 1, 
      product_name: 1, 
      user_votes: 1, 
      votes: { $sum: "$products.user_votes.vote" } 
     } 
    } }, 
    { $sort: { "products.votes": -1 } }, 
    { 
     $group: { 
      _id: "$_id", 
      company_name: { $first: "$company_name" }, 
      products: { $push: "$products" } 
     } 
    }, 

]); 

Im Fall, wenn Sie die Unternehmen behalten wollen, die kein Produkt am Ende haben. Sie können diese zusätzliche Sortierung als letzte Pipeline in der obigen Abfrage hinzufügen.

{ $sort: { "products.votes": -1 } }, 

Output von Unternehmen, die wie unten nicht Produktpalette haben möchte: -

{ 
    "_id" : ObjectId("57f2bd50dd4752c20947fd03"), 
    "company_name" : "company2", 
    "products" : [ 
     { 
      "votes" : 0 
     } 
    ] 
} 
Verwandte Themen