当命令行中的同一查询执行时,Mongoose查询不返回任何内容

时间:2014-02-17 00:01:40

标签: node.js mongodb mongoose

我有一个Mongo查询,它在Mongo控制台中返回正确的结果,但是当对Mongoose模型执行相同的查询时,它返回一个空数组。

以下行无法正常工作:

query.facilities = {$in: facilities.split(',')};

宣布我的猫鼬模型

// places
placeSchema = mongoose.Schema({
    name: String,
    category: [{ type: Schema.Types.ObjectId, ref: 'categories' }],
    facilities: [{ type: Schema.Types.ObjectId, ref: 'facilities' }],
});

Place = mongoose.model('places', placeSchema);

// categories
categorySchema = mongoose.Schema({
    name: String,
    slug: String
});

Category = mongoose.model('categories', categorySchema);

facilitiesSchema = mongoose.Schema({
    name: String,
});

Facility = mongoose.model('facilities', facilitiesSchema);

我/放置路线

app.get('/places', function(req, res){
    var geo = req.query.geo.split(',');

    if(geo.length !== 2) {
        handleError('valid_geo_coords_required');
    }

    var limit = typeof req.query.limit !== 'undefined' ? req.query.limit : 0;
    var category = req.query.category;
    var facilities = req.query.facilities;

    var query = {
        loc: {$near: geo}
    };

    if(typeof category !== 'undefined') {
        query.category = category;
    }

    if(typeof facilities !== 'undefined') {
        query.facilities = {$in: facilities.split(',')}; <---- this causes the problem
    }

    console.log(query); // pasting this into the mongo console returns correct results

    Place.find(query).limit(limit).populate('category').populate('facilities').exec(function(err, data){

    if (err) return handleError(err);

    res.json(data);
  });
});

查询对象是:

{ loc: { '$near': [ '-3.188384', '55.94772' ] }, facilities: { '$in': [ '53012d6965b5e9a35efbb215' ] } }

这是我在控制台中执行的查询:

db.places.find({ loc: { '$near': [ '-3.188384', '55.94772' ] }, facilities: { '$in': [ '53012d6965b5e9a35efbb215' ] } })

并返回有效的文档。

Mongoose是否有特定的东西影响了这个?

更新

似乎是这条线打破了它:

facilities: [{ type: Schema.Types.ObjectId, ref: 'facilities' }],

也许是因为它是objectId的数组?

1 个答案:

答案 0 :(得分:1)

如果该查询在Mongo shell中有效,那么facilities集合中文档的places数组字段必须包含字符串而不是ObjectID。

但是,根据您对places的架构定义,Mongoose会在您的查询中将facilities值转换为ObjectID,然后与places中的文档不匹配,因为它包含字符串。

修复方法是将facilities集合的文档中的places值修改为ObjectID而不是字符串。