2015-09-28 4 views
0

Когда я пишу, как этотMongoDB выбрать элемент из массива, сгруппировать их и подсчитать общее

db.Profiles.find({ userId:4790, "p2l.listId":31618 }, { "p2l.$": 1 }) 

я получить желаемый результат

... 
{ 
    "_id" : ObjectId("56052d35df3e5e564f770ed0"), 
    "p2l" : [ 
     { 
      "listId" : 31618, 
      "status" : 131 
     } 
    ] } 

{ 
    "_id" : ObjectId("56052d25df3e5e564f770ecd"), 
    "p2l" : [ 
     { 
      "listId" : 31618, 
      "status" : 25 
     } 
    ] } 

{ 
    "_id" : ObjectId("56052d1adf3e5e564f770eca"), 
    "p2l" : [ 
     { 
      "listId" : 31618, 
      "status" : 25 
     } 
    ] } 

{ 
    "_id" : ObjectId("5603c882bd1f3d3668ba7352"), 
    "p2l" : [ 
     { 
      "listId" : 31618, 
      "status" : 24 
     } 
    ] } 

, но я должен сгруппировать его по статусу

Как я могу это сделать?

Я стараюсь, как

db.Profiles.aggregate({$match:{ userId:4790, "p2l.listId":31618}}, 

{$project:{"p2l.listId":"$p2l.listId", "p2l.status":"$p2l.status"}}) 

но в rezult, у меня есть ценности, которые не соответствуют параметрам запроса. В результате, там listId = 31617

{ 
    "result" : [ 
     ... 
     { 
      "_id" : ObjectId("56052d25df3e5e564f770ecd"), 
      "p2l" : [ 
       { 
        "listId" : [ 
         31618 
        ], 
        "status" : [ 
         25 
        ] 
       } 
      ] 
     }, 
     { 
      "_id" : ObjectId("56052d1adf3e5e564f770eca"), 
      "p2l" : [ 
       { 
        "listId" : [ 
         31618, 
         31617 
        ], 
        "status" : [ 
         25, 
         25 
        ] 
       }, 
       { 
        "listId" : [ 
         31618, 
         31617 
        ], 
        "status" : [ 
         25, 
         25 
        ] 
       } 
      ] 
     }, 
     { 
      "_id" : ObjectId("5603c882bd1f3d3668ba7352"), 
      "p2l" : [ 
       { 
        "listId" : [ 
         31618 
        ], 
        "status" : [ 
         24 
        ] 
       } 
      ] 
     } 
    ], 
    "ok" : 1.0000000000000000, 
    "$gleStats" : { 
     "lastOpTime" : Timestamp(0, 0), 
     "electionId" : ObjectId("5606384b5e0803423d340427") 
    } 
} 
+1

возможно дубликат [Получить только запрашиваемый элемент в массив объектов в коллекции MongoDB] (HTTP://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection). Это означает, что различные примеры, показывающие '$ unwind' и как вам нужно« фильтровать »результаты« после »' $ unind', завершены, чтобы уменьшить соответствие массива. Пожалуйста, прекратите редактирование и начните читать то, что вы должны были найти в результатах поиска, в первую очередь. –

+0

Спасибо за ваш комментарий, помогли мне. –

+0

Он также должен помочь вам с этим большим знаменем, который вы должны увидеть сейчас, когда есть «большая синяя кнопка», в которой говорится: «Это помогло мне» (sic). Поэтому, пожалуйста, «нажмите» и закройте это как дубликат, как предполагалось. StackOverflow - это ресурс «Вопрос и ответ», который не нуждается в «двух тысячах» ответах, которые по сути являются одним и тем же. Закройте вопрос, и ссылка останется неповрежденной как для тех, кто может искать ваши условия. –

ответ

0

Я нашел решение, вот пример

db.Profiles.aggregate(
    { $match : { 
    "p2l.listId": 31618 
    }}, 
    { $unwind : "$p2l" }, 
    { $match : { 
    "p2l.listId": 31618 
    }}, 
    {$project:{"p2l":"$p2l"}}, 
    {$group:{_id : { "p2l.status": "$p2l.status"}, 
    "count": { $sum: 1 }}} 
) 
+0

Искренне некорректный подход. Поскольку вы все еще «нуждаетесь» в '$ match'» перед «you' $ unind' и array, иначе вы обрабатываете целую кучу документов, которые не соответствуют условиям, которые вы хотите. «$ Match» после «$ unwind» предназначен для «фильтрации» нежелательных результатов из содержимого массива «после того, как» идентифицированы документы с возможными совпадениями. –

+0

Но он работает и возвращает результат, который мне нужен. Если вы знаете, как еще я могу получить результат, который мне нужен, напишите. –

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