MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Trả lại tài liệu cuối cùng từ tra cứu

Bạn có thể sử dụng $slice

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

Hoặc với MongoDB 3.6, chỉ cần trả lại bài đăng cuối cùng bằng cách sử dụng $lookup ở dạng không tương quan:

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

Cái sau tốt hơn vì bạn chỉ trả lại tài liệu từ bộ sưu tập nước ngoài mà bạn thực sự muốn.

Nếu bạn chắc chắn rằng bạn muốn "số ít" thì hãy $arrayElemAt có thể hoán đổi cho nhau bằng $slice trong ví dụ ban đầu nhưng trả về phần tử cuối cùng thay vì chỉ mảng của phần tử cuối cùng. Bạn cũng có thể thêm nó vào biểu mẫu thứ hai để chỉ lấy một phần tử từ đường ống, là "luôn luôn" là một mảng:

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 ] }
   }}
])

Và xung quanh đó là 0 chỉ mục thay vì -1 cuối cùng.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kết hợp PostgreSQL và MongoDB (dưới dạng phụ trợ Django)

  2. Phát hiện xem một giá trị có chứa ít nhất một chữ số trong SQL hay không

  3. Đối số được chuyển vào phải là một chuỗi gồm 24 ký tự hex - tôi nghĩ là

  4. Định hình lại tài liệu MongoDB

  5. Cách lọc mảng trong tài liệu con với MongoDB