【问题标题】:Get particular element from mongoDB array [duplicate]从 mongoDB 数组中获取特定元素 [重复]
【发布时间】:2011-07-30 13:38:01
【问题描述】:

我有像下面这样的 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}
    ]
}

我想获得书 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 的日期。意味着只有 "books" : {"date" : 2-4-00}

在 mongo 中有可能还是我做错了什么?

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    有点想象力(pre mongo v 2.6)...

    您可以使用聚合或映射减少来做到这一点。聚合更新、更简单、更优化。这是一个返回带有聚合的子文档的示例,假设您的集合名为“作者”。我冒昧地拼写正确。

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

    你会得到一个包含单个条目的数组,如下所示:

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

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

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

    如果找到藏书并且其中只有一条记录,您将在哪里取回藏书:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        可以使用 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,{查询:{“auther”:“xyz”,“books.book1”:“b1”},出:{内联:1}})

        【讨论】:

          【解决方案4】:

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

          不支持只返回子文档。

          这个问题在 MongoDB 的工单跟踪器中有一个 outstanding ticket


          更新:该票似乎已被标记为已修复。

          请参阅here 了解如何使用它的示例。

          【讨论】:

          • 此问题已在此期间修复;看看stackoverflow.com/questions/3985214/…
          • @DanDascalescu 感谢更新,我已经更新了原版。
          • find 的第二个参数指定要检索哪些字段,这实际上是指定您需要哪些子文档。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-22
          • 2016-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-15
          • 1970-01-01
          相关资源
          最近更新 更多