MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Върнете последния документ от справка

Можете да използвате или $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 за последно.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Най-добра практика за поддържане на mgo сесия

  2. tar gzip mongo dump като MySQL

  3. Как кажете на Mongo да сортира колекция, преди да ограничи резултатите?

  4. NodeJS и MongoDB FindAndModify() трябва да бъдат премахнати или актуализирани

  5. Избягвайте предупреждението за оттегляне на текущия анализатор на URL низове, като зададете useNewUrlParser на true