Node.js 如何根据Mongoose中的父模型查询子模型限制结果

Node.js 如何根据Mongoose中的父模型查询子模型限制结果,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我甚至不知道如何表达这个问题。。。但这里有一个尝试。我把这本书称为“家长”模式,把作者称为“孩子”模式 我有两个猫鼬模型——作者和书籍: var Author = mongoose.model("Author", { name: String }); var Book = mongoose.model("Book", { title: String, inPrint: Boolean, authors: [ { type: mongoose.Schema.ObjectId, r

我甚至不知道如何表达这个问题。。。但这里有一个尝试。我把这本书称为“家长”模式,把作者称为“孩子”模式

我有两个猫鼬模型——作者和书籍:

var Author = mongoose.model("Author", {
  name: String
});

var Book = mongoose.model("Book", {
  title: String,
  inPrint: Boolean,
  authors: [ { type: mongoose.Schema.ObjectId, ref: "Author"} ]
});
我正在尝试运行一个查询,该查询将返回所有已打印书籍(父模型)的作者(子模型)。


我可以想办法用多个查询来完成,但我想知道是否有办法用一个查询来完成。

您可以使用

MongoDB中没有连接,但有时我们仍然希望引用其他集合中的文档。这就是人口的来源。在此阅读有关如何在查询结果中包含其他集合中的文档的更多信息

在您的情况下,它看起来是这样的:

Book.find().populate('authors')
.where('inPrint').equals(true)
.select('authors')
.exec(function(books) {
  // Now you should have an array of books containing authors, which can be
  // mapped to a single array.
});

我今天偶然发现了这个问题并解决了它:

Author.find()
    .populate({ path: 'books', match: { inPrint: true } })
    .exec(function (err, results) {
        console.log(results); // Should do the trick
    });
神奇之处在于
populate
match
选项,它引用了要填充的嵌套文档的属性


编辑:我把书给作者弄糊涂了,现在更正了,我认为这行不通,因为从作者那里找不到书——你可以从书中找到作者——但反过来也不行。我同意@ek_ny