2011-04-06 105 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' } ] }