2016-08-21 4 views
2

меня сильно вложенной MongoDB набор объектов, и я хочу, чтобы отсортировать subofdocuments по результату суммы их голоса, например:MongoDB агрегации вложенная объекта сумма и вид

{ 
    "_id":17846384es, 
    "company_name":"company1", 
    "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 
       } 
      ] 
     } 
    ] 
} 

я хочу, чтобы отсортировать, как по убыванию продукции в соответствии в результате сумма их голосов ожидаемый выход

{ 
    "_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":8 
     }, 
     { 
     "product_id":"123785", 
     "product_name":"product1", 
     "user_votes":[ 
       { 
       "user_id":1, 
        "vote":1 
       }, 
       { 
       "user_id":2, 
        "vote":2 
       } 
      ], 
      "votes":3 
     } 
    ] 
} 

Любая идея?

ответ

2

Следующий трубопровод

db.products.aggregate([ 
    { $unwind: "$products" }, 
    { 
     $project: { 
      company_name: 1, 
      products: 1, 
      totalVotes: { 
       $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 
       } 
      ] 
     }, 
     { 
      "product_id" : "123785", 
      "product_name" : "product1", 
      "user_votes" : [ 
       { 
        "user_id" : 1, 
        "vote" : 1 
       }, 
       { 
        "user_id" : 2, 
        "vote" : 2 
       } 
      ] 
     } 
    ] 
} 

В случае, если вы хотите, чтобы сумма голосов на уровне продукта, как показано в вашем ожидаемого результата просто модифицировать $project этап

... 
{ 
    $project: { 
     company_name: 1, 
     products: { 
      product_id: 1, 
      product_name: 1, 
      user_votes: 1, 
      votes: { $sum: "$products.user_votes.vote" } 
     } 
    } 
} 
... 
+0

Могу ли я получить этот результат с информацией о компании в одном результате? –

+0

Пожалуйста, покажите свой ожидаемый результат, чтобы избежать недоразумений – DAXaholic

+0

Просто обратите внимание, что $ sum в рамках этапа $ project доступна только в MongoDB 3.2 и выше. – Wake

Смежные вопросы