过滤 MongoDB 中的嵌入式数组

Posted

技术标签:

【中文标题】过滤 MongoDB 中的嵌入式数组【英文标题】:Filtering an embedded array in MongoDB 【发布时间】:2014-06-30 02:46:39 【问题描述】:

我有一个 Mongodb 文档,其中包含一个深深嵌入文档中的数组。在我的一项操作中,我想返回整个文档,但过滤掉该数组中不符合该条件的元素。

这是一些简化的数据:


   id: 123 ,
   vehicles : [
     name: 'Mercedes', listed: true,
     name: 'Nissan', listed: false,
     ...
   ]

因此,在此示例中,我想要整个文档,但我希望 vehicles 数组仅包含将 listed 属性设置为 true 的对象。

解决方案

理想情况下,我正在寻找使用 mongo 查询的解决方案(例如 `$unwind、$elemMatch 等...),但我也在使用 mongoose,所以使用 Mongoose 的解决方案是可以的。

【问题讨论】:

【参考方案1】:

你可以像这样使用聚合框架:

db.test312.aggregate(
    $unwind:"$vehicles",
    $match:"vehicles.name":"Nissan",
    $group:_id:"$_id",vehicles:$push:"$vehicles"
)

【讨论】:

如何在主对象中保留属性? (例如 id: 123 , name: 'testName', 车辆 : [ ... ] ) 通过将字段添加到 $group:_id:_id:"$_id",name:"$name", vehic... 或使用 _id:"$ _id",name:$last:"$name",vehic..。在第一种情况下,您需要在 $group 之后添加 $project: 以解开 _id 谢谢,我有点走第二种方式,但第一种似乎更干净 这个方法其实我也遇到过问题: 追问:***.com/questions/23636175/…【参考方案2】:

你可以使用$addToSet在组上展开并匹配列出的等于true。

示例外壳查询:

db.collection.aggregate([

    $unwind: "$vehicles"
,

    $match: 
        "vehicles.listed": 
            $eq: true
        
    
,

    $group: 
        _id: "$id",
        vehicles: 
            "$addToSet": 
                name: "$vehicles.name",
                listed: "$vehicles.listed"
            
        
    
,

    $project: 
        _id: 0,
        id: "$_id",
        vehicles: 1
    

]).pretty();

【讨论】:

以上是关于过滤 MongoDB 中的嵌入式数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 MongoDB 中的文档属性过滤器获取嵌入数组中的扁平文档数组

MongoDB请求:仅从嵌入数组中的嵌入文档中过滤特定字段

如何匹配 MongoDB 中嵌入式数组或文档中的字符串?

如何使用 mongodb 中的聚合在嵌入文档的数组中执行操作?

使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?

MongoDB中的嵌入式数组插入