我的查询看起来如此:
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中完成这项工作?
答案 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});