Mongoose 先填充,然后根据填充的字段进行过滤

Posted

技术标签:

【中文标题】Mongoose 先填充,然后根据填充的字段进行过滤【英文标题】:Mongoose populate first and then filter based on populated field 【发布时间】:2021-12-17 17:28:05 【问题描述】:

我有两个集合(itemssubitems)。 items 集合在 subItems 属性中具有对子项集合的对象引用(它是子项 ObjectId 的数组)。

我想构建一个查询,我可以首先填充subItems,然后根据填充的字段进行过滤。我尝试运行下面的查询,但似乎最后运行了填充,因此subItems[0].sharedGroups.groupId 永远无法正确过滤,因为它尚未填充。

db.items.find(
        $or: [
           'owner': 1 ,
           'subItems[0].sharedGroups.groupId':  $in: [3691]  ,
        ]
).populate('subItems');

【问题讨论】:

【参考方案1】:

您应该像这样在聚合中使用$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]  ,
          ]
        
  ]
  )

【讨论】:

看起来不错,但 subItem.sharedGroups.groupId 没有返回任何东西。我编辑了我的问题,因为 subItem 实际上是一个数组(subItems) 我添加了 $unwind,它现在可以按我的意愿工作 如果您想添加示例数据来完成我的回答,我不知道那种类型

以上是关于Mongoose 先填充,然后根据填充的字段进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:填充填充字段

猫鼬填充功能不填充

MongoDB/Mongoose:在填充字段中排序

Mongoose 无法进行深度填充

Mongoose 填充排序选项

Mongoose:使用 _id 以外的字段填充路径