【问题标题】:How Do I Query A Child Model Restricting Results Based on Parent Model in MongooseMongoose如何根据父模型查询限制结果的子模型
【发布时间】:2015-04-18 19:16:01
【问题描述】:

我什至不知道如何表达这个问题......但这是一个尝试。我将 Book 称为“父”模型,将 Author 称为“子”模型。

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

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

var Book = mongoose.model("Book", {
  title: String,
  inPrint: Boolean,
  authors: [ { type: mongoose.Schema.ObjectId, ref: "Author"} ]
});

我正在尝试运行一个查询,该查询将返回所有拥有 inPrint 书籍(父模型)的作者(子模型)。

我可以想办法用多个查询来做到这一点,但我想知道是否有办法用一个查询来做到这一点。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

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

    Author.find()
        .populate({ path: 'books', match: { inPrint: true } })
        .exec(function (err, results) {
            console.log(results); // Should do the trick
        });
    

    魔术发生在populatematch 选项中,它指的是要填充的嵌套文档的属性。

    还有check my original post

    编辑:我对作者的书籍感到困惑,现在已更正

    【讨论】:

    • 我认为这行不通,因为没有从 Author 到书的路径——你可以从书到 Author ——但反过来不行。
    • 我同意@ek_ny
    【解决方案2】:

    您可以按照docs 中的说明使用populate

    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.
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2018-05-31
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多