我有這個貓鼬模式。
const storeSchema = mongoose.Schema({
name: {
type: String,
required: true,
},
fruits: {
type: [String],
required: true,
},
});
我需要得到所有在水果陣列中有 2 個或更多香蕉的物件,就像這樣。
{
"name": "Beautiful Store",
"fruits": ["banana", "apple", "banana", "pear"]
}
我正在嘗試這樣的事情,但沒有成功......
const query = await StoreModel.find({ fruits: { $gd: 2 } })
uj5u.com熱心網友回復:
像這樣的東西:
選項1:(不太有效但直觀)
db.collection.aggregate([
{
$addFields: {
numBananas: {
$size: {
$filter: {
input: "$fruits",
as: "item",
cond: {
$eq: [
"$$item",
"banana"
]
}
}
}
}
}
},
{
$match: {
numBananas: {
$gte: 2
}
}
},
{
$project: {
name: 1,
fruits: 1
}
}
])
解釋:
- 添加帶有香蕉數量的欄位“numBananas”
- 僅過濾具有> = 2個banas的檔案
- 僅投影必要的輸出
操場
選項 2:(最好的,靈感來自下面的 Buzz :))
db.collection.aggregate([
{
$match: {
$expr: {
$gte: [
{
$size: {
$filter: {
input: "$fruits",
as: "item",
cond: {
$eq: [
"$$item",
"banana"
]
}
}
}
},
2
]
}
}
},
{$sort:{name:1}}
])
解釋:只要匹配那些有 >=2 香蕉的,最好是在水果上創建索引(我認為這個解決方案與下面 Buzz 的 $reduce 選項進行 50/50 性能競爭,我會打賭這個)
操場
uj5u.com熱心網友回復:
這是主題的兩個變體。
第一個用于$reduce直接計算香蕉的數量(本質上,{$size:{$filter...}}如上。為了獲得額外的性能,我們將 calc 和 the$match放在一個階段:
db.foo.aggregate([
{$match: {$expr: {$gte: [
{$reduce: {
input: '$fruits',
initialValue: 0,
in: {$cond:[{$eq: ['$$this','banana']}, {$add:['$$value',1]}, '$$value']}
}}, 2]}
}}
]);
第二個是通用水果計數器,以防您想要更復雜的運算式,例如 >=2 香蕉或(1 個梨和 1 個蘋果)。它的代價是$unwind/$group.
c=db.foo.aggregate([
{$unwind: '$fruits'}
,{$group: {_id: {id: '$_id', f: '$fruits'}, N: {$sum:1}}}
,{$match: {'_id.f': 'banana', N:{$gte:2}} }
]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/440277.html
標籤:javascript mongodb 猫鼬
上一篇:有沒有辦法用貓鼬過濾這個請求?
下一篇:動態Mongoose欄位型別
