从mongoDB数组中获取特定元素

Swa*_*ane 25 arrays mongodb

我有像下面的mongo集合

{
  "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}
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想得到书b1和作者xyz的唯一日期.

我有如下查询

db.coll.find({"auther" : "xyz" , "books.book1" : "b1"} , {"books.date" : 1})
Run Code Online (Sandbox Code Playgroud)

但它的输出如下

"books" : {"date" : 2-4-00} , "books" : {"date" : 4-9-00}
Run Code Online (Sandbox Code Playgroud)

我想只得到书b1和其他xyz .means的日期 "books" : {"date" : 2-4-00}

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

Gat*_* VP 21

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

不支持仅返回子文档.

这个问题在MongoDB的票务跟踪器中有一张优秀票.


更新:看起来票证已标记为已修复.

请参阅此处以获取如何使用它的示例.


bm_*_*m_i 5

它可以使用map/reduce完成,只需将子元素发送到临时内联集合中.它是一种哈克和它的作品,但是我会反对建议作为地图/减少是单线程的,并已经为你想达到什么大的开销,这是很容易,只需提取子元素在您的应用程序.

像这样......

地图:

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

降低:

r = function(key, values) {
      return this;
    }
Run Code Online (Sandbox Code Playgroud)

查询:

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