Mongoose 按引用模型的字段对模型进行嵌套查询 [英] Mongoose nested query on Model by field of its referenced model
问题描述
似乎在 stackoverflow 上有很多关于此主题的问答,但我似乎无法在任何地方找到确切的答案.
It seems like there is a lot of Q/A's on this topic on stackoverflow, but I can't seem to find an exact answer anywhere.
我有什么:
我有 Company 和 Person 模型:
I have Company and Person models:
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"的人创立的所有公司
Find all companies that people with lastname "Robertson" have founded
我的尝试:
Company.find({'founder.id': 'Robertson'}, function(err, companies){
console.log(companies); // getting an empty array
});
然后我认为 Person 没有被嵌入而是被引用,所以我使用 populate 来填充创始人-Person,然后尝试使用带有Robertson"姓氏的 find
Then I figured that Person is not embedded but referenced, so I used populate to populate founder-Person and then tried to use find with '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 作为字符串查询公司.但这并不完全是我想要的,你可以理解
I still can query companies with Person's id as a String. But it's not exactly what I want as you can understand
Company.find({'founder': '525cf76f919dc8010f00000d'}, function(err, companies){
console.log(companies); // this works
});
推荐答案
您不能在单个查询中执行此操作,因为 MongoDB 不支持连接.相反,您必须将其分解为几个步骤:
You can't do this in a single query because MongoDB doesn't support joins. Instead, you have to break it into a couple steps:
// 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
});
});
这篇关于Mongoose 按引用模型的字段对模型进行嵌套查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!