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

Truy vấn về giá trị mảng cuối cùng

Điều chính ở đây là tổng hợp $slice để lấy phần tử cuối cùng từ mảng,

db.chat.aggregate([
 { "$match": { "user1": 1,  "messages.capty": "B" } },
 { "$redact": {
   "$cond": {
     "if": { 
       "$eq": [ { "$slice": [ "$messages.capty", -1 ] }, ["B"] ]  
     },
     "then": "$$KEEP",
     "else": "$$PRUNE"
   }
 }},
 { "$project": {
   "user2": 1,
   "body": {
     "$arrayElemAt": [
       { "$map": {
         "input": { 
           "$filter": {
             "input": { "$slice": [ "$messages",-1 ] },
             "as": "m",
             "cond": { "$eq": [ "$$m.capty", "B" ] }
           }
         },
         "as": "m",
         "in": "$$m.body"
       }},
       0
     ]
   }
 }}
])

Tôi thực sự đang "cực kỳ an toàn" trong dự án $project giai đoạn với $filter nhưng về cơ bản tất cả đều giống nhau.

Đầu tiên, truy vấn chọn tài liệu, tại thời điểm này, chúng tôi thực sự không thể nói là "chỉ" khớp với phần tử cuối cùng của mảng nhưng chúng tôi muốn lọc các tài liệu không có điều kiện trên mảng.

$redact là thứ thực sự nhìn vào mục nhập mảng "cuối cùng" và kiểm tra giá trị của trường. Chúng ta không thể chỉ định trường từ mảng bằng $messages.capty mà chỉ trả về một mảng các mục đó. Sau đó, chúng tôi $slice hoặc thậm chí $arrayElemAt nếu bạn muốn lấy giá trị cuối cùng, là chỉ mục của -1 .

Tại thời điểm này, chúng tôi chỉ "lọc" những "tài liệu" không phù hợp với điều kiện. $project cuối cùng giai đoạn lấy phần tử cuối cùng của mảng, kiểm tra xem nó có khớp với điều kiện hay không (mà ở giai đoạn trước đó sẽ xảy ra), trích xuất giá trị của "body" và biến nội dung mảng đơn lẻ thành giá trị thuần túy.

Bạn có thể luân phiên bỏ qua "tính cẩn thận" và chỉ cần lấy phần tử mảng cuối cùng kể từ $redact lẽ ra phải làm xong công việc:

db.chat.aggregate([
 { "$match": { "user1": 1,  "messages.capty": "B" } },
 { "$redact": {
   "$cond": {
     "if": { 
       "$eq": [ { "$arrayElemAt": [ "$messages.capty", -1 ] }, "B" ]  
     },
     "then": "$$KEEP",
     "else": "$$PRUNE"
   }
 }},
 { "$project": {
   "user2": 1,
   "body": {
     "$arrayElemAt": [ "$messages.body", -1 ]
   }
 }}
])

Toàn bộ sự việc thực sự được chia nhỏ để "phù hợp với những điều có thể tài liệu có truy vấn "và sau đó" so sánh và trích xuất phần tử cuối cùng với $slice hoặc $arrayElemAt ".

Kết quả là:

{
        "_id" : ObjectId("593921425ccc8150f35e7663"),
        "user2" : 3,
        "body" : "hiii 23"
}
{
        "_id" : ObjectId("593921425ccc8150f35e7664"),
        "user2" : 4,
        "body" : "hiii 24"
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sử dụng chỉ mục ghép MongoDB

  2. Thêm trường không có trong giản đồ với mongoose

  3. Cách viết một lát MongoDB $ trong golang

  4. Làm cách nào để lưu 1 triệu bản ghi vào mongodb không đồng bộ?

  5. Biểu thức MongoDB để truy vấn mảng tài liệu con