0

У меня есть следующая структура документа в MongoDBграф Элементы поддокумент, которые соответствуют заданному критерию

{ 
    "_id" : "123", 
    "first_name" : "Lorem", 
    "last_name" : "Ipsum", 
    "conversations" : { 
      "personal" : [ 
        { 
          "last_message" : "Hello bar", 
          "last_read" : 1474456404 
        }, 
        { 
          "last_message" : "Hello foo", 
          "last_read" : 1474456404 
        }, 
        ... 
      ], 

      "group" : [ 
        { 
          "last_message" : "Hello Everyone", 
          "last_read" : null 
        } 
        ... 
      ] 
    } 
} 

Я хочу, чтобы подсчитать количество разговоров с суб массивов, personal и group где last_read имеет нулевое значение, для данного пользователя. Пожалуйста, как я могу это достичь?

Я пробовал:

db.messages.aggregate(
    [ 
    { $match: {"_id":"123", 'conversations.$.last_read': null }}, 
     { 
     $group: { 
      {$size: "$conversations.personal"}, {$size: "$conversations.group"} 
     } 
     } 
    ] 
); 

, но не получил его желаемого выхода. Любые лучшие идеи, пожалуйста?

ответ

1

Следующий запрос подсчитывает количество вспомогательных документов по personal и group массивам, которые имеют значение last_readnull.

$concatArrays объединяет несколько массивов в один. Он был введен в MongoDB 3.2.

db.collection.aggregate([ 
         { "$match": {"_id":"123", 'conversations.$.last_read': null }}, 
         { "$project":{"messages":{$concatArrays : ["$conversations.personal","$conversations.group"]}}}, 
         { "$unwind": "$messages"}, {$match:{"messages.last_read": null}}, 
         { "$group":{"_id":null, count: {$sum:1}}} 
       ]) 

Пример Результат:

{ "_id" : null, "count" : 3 } 
0

По вопросу, похоже, вы хотите узнать, где group array last_read содержит null. Для этого вы используете $in в агрегации, а затем unwindpersonal массив и подсчитываете массив. Проверьте пыльник агрегации Query

db.collection.aggregate({ 
    "$match": { 
     "conversations.group.last_read": { 
      "$in": [null] 
     } 
    } 
}, { 
    "$unwind": "$conversations.personal" 
}, { 
    "$group": { 
     "_id": "$_id", 
     "personalArrayCount": { 
      "$sum": 1 
     } 
    } 
}) 
Смежные вопросы