Mongoose在其引用模型的Model by字段上嵌套查询

问题描述 投票:18回答:2

在stackoverflow上似乎有很多关于这个主题的Q / A,但我似乎无法在任何地方找到确切的答案。

是)我有的:

我有公司和人员模型:

var mongoose = require('mongoose');
var PersonSchema = new mongoose.Schema{
                        name: String, 
                        lastname: String};

// company has a reference to Person
var CompanySchema = new mongoose.Schema{
                        name: String, 
                        founder: {type:Schema.ObjectId, ref:Person}};

我需要的:

找到所有姓氏为“Robertson”的人成立的公司

我尝试了什么:

Company.find({'founder.id': 'Robertson'}, function(err, companies){
    console.log(companies); // getting an empty array
});

然后我认为Person不是嵌入式的,而是引用的,所以我使用populate来填充创始人Person,然后尝试使用find和'Robertson'lastname

// 1. retrieve all companies
// 2. populate their founders
// 3. find 'Robertson' lastname in populated Companies
Company.find({}).populate('founder')
       .find({'founder.lastname': 'Robertson'})
       .exec(function(err, companies) {
        console.log(companies); // getting an empty array again
    });

我仍然可以使用Person的id作为String来查询公司。但这并不是我想要的,因为你可以理解

Company.find({'founder': '525cf76f919dc8010f00000d'}, function(err, companies){
    console.log(companies); // this works
});
node.js mongodb mongoose populate
2个回答
37
投票

您不能在单个查询中执行此操作,因为MongoDB不支持连接。相反,你必须将它分成几个步骤:

// Get the _ids of people with the last name of Robertson.
Person.find({lastname: 'Robertson'}, {_id: 1}, function(err, docs) {

    // Map the docs into an array of just the _ids
    var ids = docs.map(function(doc) { return doc._id; });

    // Get the companies whose founders are in that set.
    Company.find({founder: {$in: ids}}, function(err, docs) {
        // docs contains your answer
    });
});

2
投票

如果有人在最​​近的时间遇到​​过这种情况,Mongoose现在支持使用名为Populate的功能加入类似功能。

从Mongoose文档:

Story.findOne({ 
    title: 'Casino Royale' 
}).populate('author').exec(function (err, story) {
    if (err) return handleError(err);
    console.log('The author is %s', story.author.name);
    // prints "The author is Ian Fleming"
});

http://mongoosejs.com/docs/populate.html

© www.soinside.com 2019 - 2024. All rights reserved.