首页 > 解决方案 > 如何仅过滤文档中数组的某些行?

问题描述

我有一个 MongoDB 文档集合,使用这样的模式:

var schema = new Schema({
  name: String,
  images: [{
    uri: string,
    active: Boolean
  }]
});

我想获取所有文档(或使用某些条件进行过滤),但在images数组中检索具有特定属性的项目(在我的情况下,它是{active: true})。
这就是我现在所做的:

db.people.find( { 'images.active': true } )

但这仅检索具有至少一个活动图像的文档,这不是我需要的。

我当然知道我可以在返回 find 后过滤代码,但我不喜欢浪费内存。有没有办法可以使用猫鼬过滤文档中的数组项?

标签: javascriptnode.jsmongodbmongoose

解决方案


这是您正在寻找的聚合:

db.collection.aggregate([
  {
    $match: {}
  },
  {
    $project: {
      name: true,
      images: {
        $filter: {
          input: "$images",
          as: "images",
          cond: {
            $eq: [
              "$$images.active",
              true
            ]
          }
        }
      }
    }
  }
])

https://mongoplayground.net/p/t_VxjfiBBMK


推荐阅读