Đ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"
}