0

存在:アンワインドが私のコレクションがあるので、私は、オブジェクトの非常にネストされたMongoDBのセットを持って

{ 
    "_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 
       } 
      ] 
     } 
    ] 
} 

私はそう私は

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" } 
     } 
    } 
]) 
を使用した文書のこのサブにソートし、合計のようないくつかの操作を使用しました

{ 
    "_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 
     } 
    ] 
} 

が、製品のドキュメントdosen't私は空の結果を持って存在している場合:この結果を得るために

。製品文書がなくても会社情報で結果を得たいです。

答えて

1

まず、"preserveNullAndEmptyArrays"を使用して、商品配列を持たない会社を保存することができます。

製品の配列がない場合でも、以下のクエリで会社名を出力する必要があります。

私はあなたが投票を合計し、配列の最初の要素として最も高い数の製品を得るために製品配列をソートしようとしていると思います。以下のクエリは、結果を生成する必要があります。

最後に商品がない会社を保存したい場合は、この追加の並べ替えは、上記のクエリの最後のパイプラインとして追加できます。製品の配列を持っていない企業の

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

出力は以下の通りたいと思います: -

{ 
    "_id" : ObjectId("57f2bd50dd4752c20947fd03"), 
    "company_name" : "company2", 
    "products" : [ 
     { 
      "votes" : 0 
     } 
    ] 
} 
関連する問題