我有一個包含這樣的檔案的集合:
{
f1: {
firstArray: [
{
secondArray: [{status: "foo1"}, {status: "foo2"}, {status: "foo3"}]
}
]
}
}
我的預期結果包括在 中至少有一個專案的檔案firstArray,這是最后一個物件包含status在secondArray值的輸入陣列中(例如 ["foo3"])。
我不必使用聚合。
我試過了:
{
"f1.firstArray": {
$elemMatch: {
"secondArray.status": {
$in: ["foo3"],
},
otherField: "bar",
},
},
}
uj5u.com熱心網友回復:
您可以使用帶有$matchand的聚合管道$filter,僅保留匹配最后一項的大小大于零的檔案:
db.collection.aggregate([
{$match: {
$expr: {
$gt: [
{$size: {
$filter: {
input: "$f1.firstArray",
cond: {$in: [{$last: "$$this.secondArray.status"}, ["foo3"]]}
}
}
},
0
]
}
}
}
])
看看它在操場上的例子是如何作業的
如果您知道secondArray始終有 3 項您可以執行以下操作:
db.collection.find({
"f1.firstArray": {
$elemMatch: {
"secondArray.2.status": {
$in: ["foo3"]
}
}
}
})
但除此之外,我認為您不能只檢查最后一項而不進行聚合。這個想法是,常規find允許您撰寫不使用特定于每個檔案的值的查詢。如果陣列的大小在每個檔案上甚至在同一檔案上的不同專案上可能不同,則需要使用聚合管道
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/505657.html
