如何通过子文档数组中的数据查找文档

时间:2014-11-09 07:57:59

标签: node.js mongodb mongoose

我很难为查询找到合适的语法。

我有以下架构

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) {

这也没有影响;我假设在填充之前运行的地方。将查询分解为单独的行也没有任何影响。

2 个答案:

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