2015-08-14 4 views
0

Я работаю над проектом, используя MongoDB в качестве базы данных, и я столкнулся с проблемой: я не могу найти правильный запрос, чтобы сделать простой подсчет понравившихся документа. Коллекция, которую я использую это:Получите количество документов, понравившихся на каждый документ в MongoDB

{ "username" : "example1", 
    "like" : [ { "document_id" : "doc1" }, 
       "document_id" : "doc2 }, 
       ...] 
} 

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

{ "document_id" : "docA" , nbLikes : 30 }, {"document_id" : "docB", nbLikes : 1} 

Может кто-нибудь помочь мне в этом потому что я потерпел неудачу.

+0

То, что я думал, как решение, чтобы получить все документы, так что мы будем иметь [{ «document_id»: «doc1»}, { «document_id»: «doc2»}, {"document_id": "doc1"}, {"document_id": "doc3"} ...] И затем сделайте группу и подсчитайте. Но возможно ли сделать первый шаг? – rsabir

ответ

0

Вы можете сделать это путем разматывания like массива каждого дока, а затем группировки по document_id, чтобы получить количество для каждого значения:

db.test.aggregate([ 
    // Duplicate each doc, once per 'like' array element 
    {$unwind: '$like'}, 
    // Group them by document_id and assemble a count 
    {$group: {_id: '$like.document_id', nbLikes: {$sum: 1}}}, 
    // Reshape the docs to match the desired output 
    {$project: {_id: 0, document_id: '$_id', nbLikes: 1}} 
]) 
+0

Он работает как шарм, спасибо. Я добавлю небольшую оптимизацию: db.favorites.aggregate ([ {$ project: {имя пользователя: 1, нравится: 1}}, {$ unwind: '$ likes'}, {$ group: {_id : '$ likes.document_id', nbLikes: {$ sum: 1}}}, {$ project: {_id: 0, document_id: '$ _id', nbLikes: 1}} ]) потому что моя коллекция больше сложный, чем тот – rsabir

0

Добавить поле «likeCount» и счет увеличения для за $ нажимной работы и прочитать поле «likeCount»

db.test.update(
    { _id: "..." }, 
    { 
     $inc: { likeCount: 1 }, 
     $push: { like: { "document_id" : "doc1" } } 
    } 
)