2011-04-06 104 views
26

获取特定元素我有蒙戈收集像下面从MongoDB的阵列

{ 
    "auther" : "xyz" , 
    "location" : "zzz" , 
    "books" : 
    [ 
     {"book1" : "b1" , "date" : 2-3-00} , 
     {"book1" : "b2" , "date" : 4-9-00} 
    ] 
} 

{ 
    "auther" : "pqr", 
    "location" : "zzz" , 
    "books" : 
    [ 
     {"book1" : "b1" , "date" : 2-4-00} 
    ] 
} 

我想书B1和作者XYZ的唯一日期。

我已经铸成查询像下面

db.coll.find({"auther" : "xyz" , "books.book1" : "b1"} , {"books.date" : 1}) 

但它给人输出如下

"books" : {"date" : 2-4-00} , "books" : {"date" : 4-9-00} 

我想书B1等XYZ .means只有"books" : {"date" : 2-4-00}

的只有日期

是否有可能在mongo或我做错了什么?

回答

22

MongoDB查询语言旨在返回所有匹配的文档。

不支持仅返回子文档。

此问题在MongoDB的票证跟踪器中有outstanding ticket


UPDATE:它看起来像车票已被标记为固定。

查看here了解如何使用它的示例。

+0

在此期间已修复此问题;看看http://stackoverflow.com/questions/3985214/mongodb-extract-only-the-selected-item-in-array – 2012-11-04 13:41:17

+1

@DanDascalescu感谢您的更新,我已经更新了原件。 – 2012-11-05 18:54:09

+0

查找的第二个参数指定要检索哪些字段,哪些字段有效指定您需要哪些子文档。 – Leopd 2013-04-07 20:37:56

5

它可以使用map/reduce完成,只需将子元素发送到临时内联集合即可。它是一个Hack,它可以工作,但是我建议不要这样做,因为map/reduce是单线程的,并且对于你想要实现的内容有很大的开销,在应用程序中提取子元素要容易得多。

事情是这样的......

地图:

m = function() { 
    this.books.forEach(function(book){ 
     if(book1 == 'b1'){ 
      emit("books", {date: book.date,}); 
     } 
    }); 
} 

减少:

r = function(key, values) { 
     return this; 
    } 

查询:

 
    db.coll.mapReduce(m, r, {query : {"auther" : "xyz" , "books.book1" : "b1"}, out: { inline : 1}}) 

3

,如果你想只选择匹配的元素,您可以这样查询。

b.coll.find({ “auther”: “XYZ”, “books.book1”: “B1”},{ “书$日期。”:1})

1

有一点想象力(前蒙戈v 2.6)...

你可以做到这一点与聚合或地图减少。聚合更新,更容易,更优化。下面是一个样例,假设您的集合名为“Authors”,则返回一个带有集合的子文档。我冒昧地正确拼写事物。

Authors.aggregate([ 
    { $match: { author: 'xyz' } }, 
    { $unwind: '$books' }, 
    { 
    $project: { 
     _id: '$books.book1', 
     date: '$books.date' 
    } 
    }, 
    { $match: { '$_id' : 'b1' } } 
]); 

你会得到一个阵列,像这样一个条目:

[{ _id: 'b1', date: '2-4-00' }] 

否则,如果蒙戈2.6+你可以做的非常简单的方法:

Authors.find({ 
    author: 'xyz', 
    books: { $elemMatch: { book1: 'b1' } } 
},'books') 

如果找到并且只有一条记录,您将从哪里找回书籍收藏:

{ _id: 'xyz', books: [ { book1: 'b1', date: '2-4-00' } ] }