如何在MongoDB集合中获取特定的嵌入式文档?

She*_*har 29 mongodb

我有一个集合Notebook,其中包含名为Notes的嵌入式数组文档.例子

文档如下所示.

{
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"),
"name" : "MongoDB",
"notes" : [
            {
              "title" : "Hello MongoDB",
              "content" : "Hello MongoDB"
            },
            {
              "title" : "ReplicaSet MongoDB",
              "content" : "ReplicaSet MongoDB"
            }
         ]
}
Run Code Online (Sandbox Code Playgroud)

我想找出只有标题为"Hello MongoDB"的注释.我不应该得到什么

是查询.谁能帮我.

小智 81

您可以使用更高版本的mongo版本2.2来执行此操作

像这样的查询:

db.coll.find({ 'notes.title': 'Hello MongoDB' }, {'notes.$': 1});
Run Code Online (Sandbox Code Playgroud)

你可以和$elemMatchJustin Jenkins一样尝试

  • 这应该是正确的答案 (5认同)
  • 除非从查询中排除_id,否则这将返回父文档的_id和嵌入对象:...''notes.$':1,'_ id':0}); (4认同)
  • @etech现在我在这里找到了有关$ projection的文档https://docs.mongodb.org/master/reference/operator/projection/positional/#proj._S_ (4认同)

Jus*_*ins 37

过时的答案:见其他答案.


我不相信你问的是可能的,至少没有一些map-reduce可能吗?

请参阅此处:过滤MongoDB中的嵌入式文档

该答案建议您更改架构,以更好地适应您希望如何处理数据.

您可以使用"点符号"或$ elemMatch来获取具有匹配"注释标题"的正确文档...

> db.collection.find({ "notes.title" : "Hello MongoDB"}, { "notes.title" : 1"});
Run Code Online (Sandbox Code Playgroud)

要么 ...

> db.collection.find({ "notes" : { "$elemMatch" : { "title" : "Hello MongoDB"} }});
Run Code Online (Sandbox Code Playgroud)

但是你会得到整个数组,而不仅仅是导致匹配的数组元素.

另外,要考虑一下......使用当前的设置,很难对阵列中的项目进行任何操作.

如果你不改变你的架构(作为与建议相关联的答案)......我会考虑在数组中的每个元素中添加"ids",这样你就可以在需要时轻松删除它.


Ina*_*mus 8

您可以使用聚合在 MongoDb 3.2+ 版中执行此操作。

询问:

db.Notebook.aggregate(
    {
        $project: {
            "notes": {
                $filter: {
                    input: "$notes",
                    as: "note",
                    cond: { 
                        $eq: [ "$$note.title", "Hello MongoDB" ]
                    }
                }
            }
        }
    }
)
Run Code Online (Sandbox Code Playgroud)

结果:

{ 
    "_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
    "notes" : [ 
        { 
            "title" : "Hello MongoDB", 
            "content" : "Hello MongoDB" 
        } 
    ] 
}
Run Code Online (Sandbox Code Playgroud)

$$在这里用来访问变量。我这里使用的访问新创建的note内部变量$filter

您可以在有关$filter$eq$$的官方文档中找到更多详细信息。

$filter:根据指定条件选择要返回的数组子集。返回一个仅包含与条件匹配的元素的数组。返回的元素按原始顺序排列。

$eq:比较两个值并在值相等或不相等时返回真/假(...)。

$$:变量可以保存任何 BSON 类型的数据。要访问变量的值,请使用变量名以双美元符号 ($$) 为前缀的字符串。


笔记:

贾斯汀詹金的回答已经过时,kop 的回答没有从集合中返回多个文档。使用此聚合查询,您可以根据需要返回多个文档。

我需要这个,想发帖来帮助别人。