Вернуть последний документ из поиска - PullRequest
0 голосов
/ 22 мая 2018
db.groups.aggregate([
   {
     $lookup:
       {
         from: "posts",
         localField: "_id",
         foreignField: "group",
         as: "post"
       }
  }
])

Я получаю ответ для групп и всех сообщений, таких как .. [{geoup1, [массив сообщений]}, {group2, [массив сообщений]}]

Если есть сообщение, которое япросто хочу последнее добавленное сообщение в коллекцию сообщений

1 Ответ

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

Вы можете использовать $slice

db.groups.aggregate([
   { "$lookup": {
     "from": "posts",
     "localField": "_id",
     "foreignField": "group",
     "as": "post"
   }},
   { "$addFields": {
     "post": { "$slice": ["$post", -1] }
   }}
])

Или с MongoDB 3.6, просто вернуть последнее сообщение, используя $lookup в некоррелированном видеформа:

db.groups.aggregate([
   { "$lookup": {
     "from": "posts",
     "as": "post",
     "let": { "id": "$_id" },
     "pipeline": [
       { "$match": { 
          "$expr": { "$eq": [ "$$id", "$group" ] }
       }},
       { "$sort": { "_id": -1 } },
       { "$limit": 1 }
     ]
   }}
])

Последнее лучше, потому что вы возвращаете документ только из той иностранной коллекции, которая вам действительно нужна.

Если вы уверены, что хотите "единственное число", тогда $arrayElemAt взаимозаменяем с $slice в первоначальном примере, но возвращает последний элемент вместо массива только последнего элемента.Вы также можете добавить его во вторую форму, чтобы просто взять один элемент из конвейера, который «всегда» является массивом:

db.groups.aggregate([
   { "$lookup": {
     "from": "posts",
     "as": "post",
     "let": { "id": "$_id" },
     "pipeline": [
       { "$match": { 
          "$expr": { "$eq": [ "$$id", "$group" ] }
       }},
       { "$sort": { "_id": -1 } },
       { "$limit": 1 }
     ]
   }},
   { "$addFields": {
     "post": { "$arrayElemAt": [ "$post", 0 ] }
   }}
])

И наоборот, это индекс 0, а не -1для последнего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...