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

时间:2012-04-06 13:12:13

标签: mongodb

我有一个集合Notebook,其中包含名为Notes的嵌入式数组文档。样本

文档如下所示。

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

我想要找出标题为“Hello MongoDB”的注释。我没有得到应该

的东西

是查询。任何人都可以帮助我。

5 个答案:

答案 0 :(得分:80)

您可以使用mongo version higher 2.2

执行此操作

这样的查询:

db.coll.find({ 'notes.title': 'Hello MongoDB' }, {'notes.$': 1});

您可以尝试与贾斯汀詹金斯一样的$elemMatch

答案 1 :(得分:37)

过时回答:请参阅其他答案。


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

见这里:Filtering embedded documents in MongoDB

该答案建议您更改架构,以更好地适应您希望如何使用数据。

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

> db.collection.find({ "notes.title" : "Hello MongoDB"}, { "notes.title" : 1"});

或......

> db.collection.find({ "notes" : { "$elemMatch" : { "title" : "Hello MongoDB"} }});

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

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

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

答案 2 :(得分:3)

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

<强>查询:

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

<强>结果:

{ 
    "_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
    "notes" : [ 
        { 
            "title" : "Hello MongoDB", 
            "content" : "Hello MongoDB" 
        } 
    ] 
}

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

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

  

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

     

$ eq:比较两个值,当值等于或等于(...)时返回true / false。

     

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

注意:

Justin Jenkin的回答已经过时,kop的回答并没有从集合中返回多个文件。使用此聚合查询,您可以根据需要返回多个文档。

我需要这个并希望发帖以帮助某人。

答案 3 :(得分:0)

您可以使用$或$ elemMatch。 $运算符和$ elemMatch运算符根据条件从数组中投射元素的子集。

$ elemMatch投影运算符采用显式条件参数。这允许您根据不在查询中的条件进行投影。

db.collection.find(
    {
        // <expression>
    },
    {
        notes: {
            $elemMatch: {
                title: 'Hello MongoDB'
            }
        },
        name: 1
    }
)

$运算符根据查询语句中的某些条件投射数组元素。

db.collection.find(
    {
        'notes.title': 'Hello MongoDB'
    },
    {
        'notes.title.$': 1,
         name: 1
    }
)

答案 4 :(得分:-3)

您可以执行以下查询:

db.coll.find({ 'notes.title': 'Hello MongoDB' });

您还可以参考docs了解更多详情。