我有一个集合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一样尝试
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",这样你就可以在需要时轻松删除它.
您可以使用聚合在 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 的回答没有从集合中返回多个文档。使用此聚合查询,您可以根据需要返回多个文档。
我需要这个,想发帖来帮助别人。
| 归档时间: |
|
| 查看次数: |
62435 次 |
| 最近记录: |