2012-04-06 117 views
29

我有一个集合Notebook的嵌入式数组文件,称为Notes。样本如何在MongoDB集合中获取特定的嵌入式文档?

文档如下所示。

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

我只想找出标题为“Hello MongoDB”的注释。我没有得到什么

是查询。谁能帮我。

回答

36

过时的回答:查看其他答案。


我不相信你问什么是可能的,至少没有一些可能的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"} }}); 

但你会回来整个阵列,不仅导致了比赛的数组元素。

此外,一些思考...您的当前设置它woud是很难做到的数组中的项目的任何操作。

如果你不改变你的架构(如答案链接到建议)...我会考虑在阵列中加入“IDS”每一个元素,所以你可以做这样的事情,如果需要方便地将其删除。

-3

可以这样进行查询:

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

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

+8

嗡嗡声我相信什么是被问到的是如何取回只有**注释**'你好MongoDB'作为**标题**,你的例子会带回注释数组的*整个文档! – 2012-04-06 17:54:13

73

你可以用蒙戈版本做高2.2

查询是这样的:

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

你可以$elemMatch尝试像贾斯汀·詹金斯

+5

这应该是正确的答案 – KIC 2014-02-21 13:31:51

+3

这将返回嵌入对象的父文档的_id,除非从查询中排除_id:... {'notes。$':1,'_id':0}); – Ushox 2015-06-27 10:03:44

+0

您正在使用的查询结构的文档在哪里? – etech 2016-02-25 14:32:58

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 
    } 
) 
2

你可以在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" 
     } 
    ] 
} 

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

你可以在官方文档中找到关于$filter$eq$$的更多资料。

$滤波器:选择的阵列的一个子集返回基于指定的条件。返回仅包含与条件匹配的元素的数组。返回的元素按原始顺序排列。

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

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


注:

贾斯汀·詹金的回答是过时的,在这里KOP的回答不从集合返回多个文件。通过这个汇总查询,您可以根据需要返回多个文档。

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

相关问题