如何僅檢索檔案我的條件滿足子陣列中的所有元素?
我的檔案:
{
"_id" : ObjectId("5234cc89687ea597eabee675"),
"code" : "xyz",
"tags" : [
"school",
"book",
"bag",
"headphone",
"appliance"
],
"qty" : [
{
"size" : "S",
"num" : 10,
"color" : "blue"
},
{
"size" : "M",
"num" : 45,
"color" : "blue"
},
{
"size" : "M",
"num" : 60,
"color" : "blue"
},
{
"size" : "L",
"num" : 100,
"color" : "green"
}
]
}
{
"_id" : ObjectId("5234cc8a687ea597eabee676"),
"code" : "abc",
"tags" : [
"appliance",
"school",
"book"
],
"qty" : [
{
"size" : "6",
"num" : 100,
"color" : "green"
},
{
"size" : "6",
"num" : 50,
"color" : "blue"
},
{
"size" : "8",
"num" : 100,
"color" : "brown"
}
]
}
對于這個查詢,我檢索了這個檔案,但我預計沒有結果,因為在陣列中有一個值為 60 的元素......陣列的所有元素都必須滿足條件
db.getCollection('test').find({
qty: { $all: [
{ "$elemMatch" : { size: "M", num: { $lt: 50} } }
] }
} )
我的結果是:
{
"_id" : ObjectId("5234cc89687ea597eabee675"),
"code" : "xyz",
"tags" : [
"school",
"book",
"bag",
"headphone",
"appliance"
],
"qty" : [
{
"size" : "S",
"num" : 10,
"color" : "blue"
},
{
"size" : "M",
"num" : 45,
"color" : "blue"
},
{
"size" : "M",
"num" : 60,
"color" : "blue"
},
{
"size" : "L",
"num" : 100,
"color" : "green"
}
]
}
或者在這種情況下只產生一個滿足條件的專案,而不是全部:
db.getCollection('test').aggregate([
{ $unwind: '$qty'},
{ $match: {'qty.size': {$eq: "M"}}},
{ $match: {'qty.num': {$lt: 50}}}
])
我的結果是:
{
"_id" : ObjectId("5234cc89687ea597eabee675"),
"code" : "xyz",
"tags" : [
"school",
"book",
"bag",
"headphone",
"appliance"
],
"qty" : {
"size" : "M",
"num" : 45,
"color" : "blue"
}
}
uj5u.com熱心網友回復:
您可以使用$map創建一個輔助布爾陣列來對您的條件進行檢查。之后,使用$allElementsTrue執行過濾。
db.collection.aggregate([
{
"$addFields": {
"filterArr": {
"$map": {
"input": "$qty",
"as": "q",
"in": {
$and: [
{
$eq: [
"$$q.size",
"M"
]
},
{
$lt: [
"$$q.num",
50
]
}
]
}
}
}
}
},
{
"$match": {
$expr: {
"$allElementsTrue": "$filterArr"
}
}
},
{
"$project": {
filterArr: false
}
}
])
這是Mongo游樂場供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462455.html
