在方法的lookup部分aggregate,我怎樣才能只保留在外國集合中有價值的檔案?
例如,我有這個集合users:
[
{ _id: 1, name: 'John', basketId: 4 },
{ _id: 2, name: 'mari', basketId: 9 },
{ _id: 3, name: 'tedd', basketId: 32 },
{ _id: 4, name: 'sara', basketId: 14 },
{ _id: 5, name: 'jane', basketId: 3 },
.
.
.
]
還有一個名為baskets
[
{ _id: 1, items: 0 },
{ _id: 2, items: 2 },
{ _id: 3, items: 0 },
{ _id: 4, items: 0 },
{ _id: 5, items: 7 },
.
.
.
]
現在,如果我想獲得購物籃專案大于 0 的用戶,我使用aggregateand lookup:
UserModel.aggregate([
{ $lookup:
{
from: 'baskets',
localField: 'basketId',
foreignField: '_id',
pipeline: [{ $match: { items: { $gt: 0 } } }],
as: 'basket'
}
}
])
它為所有用戶提供他們的購物籃資料。對于那些購物籃專案為 0 的用戶,它顯示basket: []。
但我只需要獲取購物籃專案大于 0 的用戶。怎么做?
uj5u.com熱心網友回復:
您不應該將$match舞臺放在$lookup. 它所做的是過濾要在basket陣列中回傳的檔案。
相反,您需要一個階段來通過比較陣列中$match第一個檔案的items值來過濾檔案。basket
UserModel.aggregate([
{
$lookup: {
from: "baskets",
localField: "basketId",
foreignField: "_id",
as: "basket"
}
},
{
$match: {
$expr: {
$gt: [
{
$first: "$basket.items"
},
0
]
}
}
}
])
演示 1 @ Mongo 游樂場
這個問題是模棱兩可的。您也可以查找以下查詢(但會回傳與Demo 1相同的結果):
UserModel.aggregate([
{
$lookup: {
from: "baskets",
localField: "basketId",
foreignField: "_id",
pipeline: [
{
$match: {
items: {
$gt: 0
}
}
}
],
as: "basket"
}
},
{
$match: {
$expr: {
$gt: [
{
$size: "$basket"
},
0
]
}
}
}
])
或者檢查不是空陣列
{
$ne: [
"$basket",
[]
]
}
演示 2 @ Mongo 游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/531144.html
