Mongoose错误 - 在使用这些参数调用where()之后必须使用elemMatch()

时间:2014-03-02 03:44:27

标签: node.js mongodb express mongoose

我有以下架构:

UserSchema = new Schema({
  'username': { type: String, validate: [validatePresenceOf, 'a username is required'], index: { unique: true } },
  'hashed_password': String,
  'salt': String,
  'locations': [LocationSchema]
});

LocationSchema = new Schema({
  'lat': Number,
  'lng': Number,
  'address': { type: String, validate: [validatePresenceOf, 'The address is required in order to add a new location.'] },
  'name': String
});

我正在尝试通过它的id找到特定的单个位置文档。为此,我尝试按位置键查询用户集合项,位置键是位置文档的数组。我的查询如下:

var query = User.find({"locations.$": 1})
                .where()
                .elemMatch({locations: {_id : ObjectId('531283690315992f05bcdc98')}})
                .exec(function(err, data){

                  console.log(err);
                  console.log(data);
                });

运行时出现以下错误:

错误:在使用这些参数

调用where()之后,必须使用elemMatch()

这是什么意思?我似乎无法找到一个好的解释。

忘记提及,我可以通过运行以下命令从mongo shell获取我想要的数据:db.users.find({locations: {$elemMatch : {_id : ObjectId('531283690315992f05bcdc98')}}}, {"locations.$": 1});

1 个答案:

答案 0 :(得分:5)

您需要提供where电话的路径并重新排序:

User.find()
    .where('locations')
    .elemMatch({_id : ObjectId('531283690315992f05bcdc98')})
    .select({'locations.$': 1})
    .exec(function(err, data){
        console.log(err);
        console.log(data);
    });

但你也可以稍微简化它,因为你不需要在这里使用$elemMatch,你可以让Mongoose负责投射:

User.find()
    .where('locations._id', '531283690315992f05bcdc98')
    .select({'locations.$': 1})
    .exec(function(err, data){
        console.log(err);
        console.log(data);
    });