2014-09-05 2 views
1

Я изучаю совокупность в mongodb. Я работаю с коллекцией:Коллекция агрегатов Mongodb

    { 
          "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Linnie Weigel" 
      }, 
      { 
        "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Dinah Sauve" 
      }, 
      { 
        "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Zachary Langlais" 
      } 
      { 
        "body" : "" 
    , 
        "email" : "[email protected]", 
        "author" : "Jesusa Rickenbacker" 
      } 
    ] 

Я пытаюсь получить количество тел каждого автора. Но когда я выполняю команду суммой агрегатного mongodb, результат равен 1 (потому что структура имеет только один элемент). Как я могу выполнить эту операцию ?. Я попробовал с $ addToSet. Но я не знаю, как получить каждый элемент коллекции и выполнить операцию.

+0

Не могли бы вы включить код, который вы использовали? Кроме того, это из вашего университетского задания mongodb? –

+0

Вы говорите «выполните команду sum» - такой команды нет. Вы говорите о $ group stage, где вы можете использовать оператор $ sum для получения ответа (пока вы группируете в нужном поле). –

+0

Мой код: var group = {$ group: {_ id: "$ author", total: {$ addToSet: "$ comments.author"}}}: –

ответ

2

Для подсчета комментариев от каждого автора вы хотите $group этого автора и $sum вхождений. В основном просто операция «$ sum: 1». Но похоже, что у вас есть «комментарии» в виде массива, основанные на ваших собственных комментариях и закрывающей скобке для вашего частичного перечисления данных. Для этого вам необходимо обработать с $unwind первыми:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": "$comments.author", 
     "count": { "$sum": 1 } 
    }} 
]) 

Это позволит получить общее количество всех комментариев автора автора для всей коллекции. Если бы вы были только после получения полных комментариев по автору за каждый документ (или то, что выглядит как блог после модели), то вы используете документ _id в рамках группового заявления:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": { 
      "_id": "$_id" 
      "author": "$comments.author" 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

И если вы потом хотите резюме от автора рассчитывает за один документ с помощью всего одного документа, возвращенного со всеми авторами в массиве, а затем использовать $addToSet здесь, с другой стадии $group трубопровода:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": { 
      "_id": "$_id" 
      "author": "$comments.author" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": "$_id._id", 
     "comments": { 
      "$addToSet": { 
       "author": "$_id.author", 
       "count": "$count" 
      } 
     } 
    }} 
]) 

Но на самом деле, ценности автор уже уникален и «наборы "не заказываются каким-либо образом, поэтому вы можете изменить это, используя $push после первого введения $sort иметь список упорядочивается по количеству сделанных замечаний:

db.collection.aggregate([ 
    { "$unwind": "$comments" }, 
    { "$group": { 
     "_id": { 
      "_id": "$_id" 
      "author": "$comments.author" 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$sort": { "_id._id": 1, "count": -1 } }, 
    { "$group": { 
     "_id": "$_id._id", 
     "comments": { 
      "$push": { 
       "author": "$_id.author", 
       "count": "$count" 
      } 
     } 
    }} 
]) 
Смежные вопросы