Подсчитать и применить условие для нарезки документа массива mongodb - PullRequest
0 голосов
/ 09 мая 2018

Моя структура документа выглядит следующим образом:

{
   "_id" : ObjectId("5aeeda07f3a664c55e830a08"),
   "profileId" : ObjectId("5ad84c8c0e71892058b6a543"),
   "list" : [ 
      {           
        "content" : "answered your post",
        "createdBy" : ObjectId("5ad84c8c0e71892058b6a540")
      }, 
      {           
        "content" : "answered your post",
        "createdBy" : ObjectId("5ad84c8c0e71892058b6a540")
      }, 
      {
        "content" : "answered your post",
        "createdBy" : ObjectId("5ad84c8c0e71892058b6a540")
      }, 
    ],   
}

Я хочу посчитать массив список поле. И примените условие перед нарезкой, что

если list<=10 , тогда разделите все элементы списка

else 10 элементов .

P.S Я использовал этот запрос, но возвращает ноль.

db.getCollection('post').aggregate([
 {
  $match:{
       profileId:ObjectId("5ada84c8c0e718s9258b6a543")}
 },
 {$project:{notifs:{$size:"$list"}}},    
 {$project:{notifications:
            {$cond:[
                {$gte:["$notifs",10]},
                {$slice:["$list",10]},
                {$slice:["$list","$notifs"]}
            ]}
          }}
])

1 Ответ

0 голосов
/ 09 мая 2018

Ваш первый $project этап эффективно уничтожает все поля результатов, кроме одного (ий), который он явно проецирует (только notifs в вашем случае). Вот почему второй этап $project не может $slice поле list больше (он был удален первым этапом $project).

Кроме того, я думаю, что ваша комбинация $cond / $slice может быть более элегантно выражена с помощью оператора $min. Итак, есть как минимум два следующих решения вашей проблемы:

Использование $addFields:

db.getCollection('post').aggregate([
  { $match: { profileId: ObjectId("5ad84c8c0e71892058b6a543") } },
  { $addFields: { notifs: { $size: "$list" } } },    
  { $project: {
    notifications: {
      $slice: [ "$list", { $min: [ "$notifs", 10 ] } ]
    }
  }}
])

Использование вычислений внутри $ project - это позволяет избежать стадии, поэтому должно быть предпочтительнее.

db.getCollection('post').aggregate([
  { $match: { profileId: ObjectId("5ad84c8c0e71892058b6a543") } },
  { $project: {
    notifications: {
      $slice: [ "$list", { $min: [ { $size: "$list" }, 10 ] } ]
    }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...