将对象数组过滤到mongodb / meteor中的单个匹配对象

时间:2015-04-27 20:27:34

标签: javascript node.js mongodb meteor

我的查询看起来如此:

var writer = Writers.findOne({
  _id: writerId,
  books: {
    $elemMatch: {
      id: Books.findOne({ slug: bookSlug })._id
    }
  }
});

但是,这将返回查询中的完整类列表。

{
  name: "H.P. Lovecraft",
  books: [{
    id: "1234",
    slug: "at-the-mountains-of-madness"
  }, {
    id: "5678",
    slug: "herbert-west-reanimator"
  }]
}

是否有办法消除除了我想要的列表中的一个项目之外的所有信息并将其变成对象?也就是说,我希望我的最终结果是:

{
  name: "H.P Lovecraft",
  book: {
    id: "1234",
    slug: "herbert-west-reanimator"
  }
}

如何使用mongodb在Meteor中完成这项工作?

1 个答案:

答案 0 :(得分:2)

您可以采用的一种方法是将$elemMatch投影运算符与findOne()查询一起使用。对于_id等于writerId的文档,$elemMatch投影仅返回数组中的第一个匹配元素:

var bookId = Books.findOne({ slug: bookSlug })._id,
    writer = Writers.findOne({ _id: writerId },
                             { books: { $elemMatch: { id: bookId } }, 
                               _id: 0,
                               name: 1
                             }
    );

另一种方法是使用Underscore library's _.find()方法返回特定的数组元素:

var bookId = Books.findOne({ slug: bookSlug })._id,
    writer = Writers.findOne({
        _id: writerId,
        books: {
            $elemMatch: {
                id: bookId
            }
        }
    }),
    book = _.find(writer.books, function(book) {return book.id === bookId});