我有以下架构:
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});
答案 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);
});