我很难为查询找到合适的语法。
我有以下架构
var Person = mongoose.Schema({
name: String,
cars: [{type: Schema.Types.ObjectId, ref: 'Car'}] -- Note this is an array
});
我想写一个有效地告诉我所有拥有红色汽车的人的查询。
我想我想要的东西:
Person.find().populate('cars').match({colour:red}).exec(function(err, models) {....
但我无法找到任何文件来支持这一点。任何提示赞赏。
编辑:
这段代码越来越近了,但仍然没有
Person.find()
.populate({path: 'cars', match: {colour: "red"}})
.exec(function (err, Persons) {
原因是,它会返回所有人员#39;记录,只填充汽车'在populate函数中匹配的数组。结果我在那里得到了很多Person.cars.length === 0。
如果我在find中添加修改:
Person.find()
.populate({path: 'cars', match: {colour: "red"}})
.where({'cars' : {$not: {$size: 0}}}
.exec(function (err, Persons) {
这也没有影响;我假设在填充之前运行的地方。将查询分解为单独的行也没有任何影响。
答案 0 :(得分:1)
试试这个,以这种方式分解
var q = Person.find();
q.populate('cars').match({color:red}).exec(function(err, models) {....}
或者这个,效果相同
var q = Person.find();
q.populate({path: 'cars', match: { color:red}}).exec(function(err, models) {....}
然后你必须过滤汽车是否存在
像
.exec(function(err, models){
models= docs.filter(function(model){
return doc.cars.length;
})
// do stuff with models
});
答案 1 :(得分:1)
通常更有效地翻转这些类型的查询并首先找到所有红色汽车的_ids,然后找到那些汽车的人:
Car.find({colour: 'red'}, function(err, cars) {
var carIds = cars.map(function(car) {
return car._id;
});
Person.find({cars: {$in: carIds}}, function(err, persons) {...});
});