我有一个集合Notebook,其中包含名为Notes的嵌入式数组文档。样本
文档如下所示。
{
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"),
"name" : "MongoDB",
"notes" : [
{
"title" : "Hello MongoDB",
"content" : "Hello MongoDB"
},
{
"title" : "ReplicaSet MongoDB",
"content" : "ReplicaSet MongoDB"
}
]
}
我想要找出标题为“Hello MongoDB”的注释。我没有得到应该
的东西是查询。任何人都可以帮助我。
答案 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)