猫鼬先填充,然后根据填充的字段进行过滤
Mongoose populate first and then filter based on populated field
我有两个 collection(items
和 subitems
)。 items
collection 在 subItems
属性 中有一个 object 对子项 collection 的引用(这是一个子项 ObjectId 数组)。
我想构建一个查询,我可以先填充 subItems
,然后根据填充的字段进行过滤。我尝试了 运行 下面的查询,但似乎填充是最后 运行,因此 subItems[0].sharedGroups.groupId
永远无法正确过滤,因为它尚未填充。
db.items.find({
$or: [
{ 'owner': 1 },
{ 'subItems[0].sharedGroups.groupId': { $in: [3691] } },
]
}).populate('subItems');
你应该使用 $lookup
然后 $match
像这样聚合
db.items.aggregate([
{
$lookup:{
from:"subItems",
localField:"subItems", // field of reference to subItem
foreignField:"_id",
as :"subItems"
}},
{
$match:
{
$or: [
{ 'owner': 1 },
{ 'subItems.sharedGroups.groupId': { $in: [3691] } },
]
}
}]
)
我有两个 collection(items
和 subitems
)。 items
collection 在 subItems
属性 中有一个 object 对子项 collection 的引用(这是一个子项 ObjectId 数组)。
我想构建一个查询,我可以先填充 subItems
,然后根据填充的字段进行过滤。我尝试了 运行 下面的查询,但似乎填充是最后 运行,因此 subItems[0].sharedGroups.groupId
永远无法正确过滤,因为它尚未填充。
db.items.find({
$or: [
{ 'owner': 1 },
{ 'subItems[0].sharedGroups.groupId': { $in: [3691] } },
]
}).populate('subItems');
你应该使用 $lookup
然后 $match
像这样聚合
db.items.aggregate([
{
$lookup:{
from:"subItems",
localField:"subItems", // field of reference to subItem
foreignField:"_id",
as :"subItems"
}},
{
$match:
{
$or: [
{ 'owner': 1 },
{ 'subItems.sharedGroups.groupId': { $in: [3691] } },
]
}
}]
)