Mongo:如何仅检索与某些属性匹配的子文档

Posted

技术标签:

【中文标题】Mongo:如何仅检索与某些属性匹配的子文档【英文标题】:Mongo: how to retrieve ONLY subdocs that match certain properties 【发布时间】:2016-04-15 01:58:20 【问题描述】:

例如,有一个名为 test 的集合,其中包含以下文档:


    "_id" : ObjectId("5692ac4562c824cc5167379f"),
    "list" : [ 
        
            "name" : "elem1",
            "type" : 1
        , 
        
            "name" : "elem2",
            "type" : 2
        , 
        
            "name" : "elem3",
            "type" : 1
        , 
        
            "name" : "elem4",
            "type" : 3
        , 
        
            "name" : "elem4",
            "type" : 2
        
    ]

假设我想检索list 中匹配的子文档的列表:

type = 2

我尝试了以下查询

db.getCollection('test').find(
    '_id': ObjectId("5692ac4562c824cc5167379f"),
    'list.type': 1
)

但我得到的结果包含list 内的每个 子文档,我猜这是因为list 内至少有一个类型为等于 1 的文档.

取而代之的是,我有兴趣获得的结果将是list 中与'list.type': 1 匹配的每个子文档


    "_id" : ObjectId("5692ac4562c824cc5167379f"),
    "list" : [ 
        
            "name" : "elem1",
            "type" : 1
        , 
        
            "name" : "elem3",
            "type" : 1
        
    ]

...所以$$elemMatch 并不是我真正想要的,因为它们只返回第一个匹配元素。

有人知道如何实现我的目标吗?

【问题讨论】:

Retrieve only the queried element in an object array in MongoDB collection的可能重复 @user3100115 不是真的,我不想要只有一个元素,我想要所有匹配的元素!!! 检查使用.aggregate()方法的答案。 【参考方案1】:
db.myCol.aggregate([ 
                     $unwind: "$list" , 
                     $match:  "list.type":1  , 
                     $group:  "_id":"$_id", list: $push:"$list" 
])

【讨论】:

以上是关于Mongo:如何仅检索与某些属性匹配的子文档的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Mongo Java驱动程序从集合中检索随机文档

如何从 Mongo DB 中的子文档数组中删除匹配条件的子文档

如何在其中一个字段 Mongo Db [重复] 中检索具有最大值的文档

Mongoose - 检索到的文档中没有“_id”属性

mongo 数组元素检索与排序

如何使用_id(node.js)检索mongoDB中关联的子文档