样本数据:
[{ "_id": "529532bee0ea703842000003", "patientId": "123", "name": { "firstName": "John", "family": "Smith" }, "diet": [{ "_id": "1", "mealtType": "Break Fast", "timeofMeal": "2013-11-12T03:05:06.000Z", "status": "I", "calorie": { "value": 500, "unit": "cals" } }, { "_id": "1", "mealtType": "Break Fast", "timeofMeal": "2013-11-12T03:05:06.000Z", "status": "A", "calorie": { "value": 550, "unit": "cals" } }] }]
我想在节点中使用mongoose仅获取给定patientId('123')的活动(状态'A')嵌入文档(饮食文档).
这是我的猫鼬查询:
query.where('patientId', 123) .where('diet').elemMatch(function(elem) { elem.where('_id', 1) elem.where('status', 'A') })
Mongoose在查询下面生成,它为患者提供嵌入式阵列饮食中的所有元素.
Mongoose: patients.find({ diet: { '$elemMatch': { _id: '1', status: 'A' } }, patientId: '123' })
无论Mongo Shell的状态如何,上面的查询都会获取所有子文档.
他们只有通过将每个条件包裹在条件{'patientId':'123'},{'diet':{$ elemMatch:{'status':'A'}}}中,才能使它在Mongo shell中运行.
db.patients.find({'patientId':'123'},{'diet' : { $elemMatch : {'status':'A'} }} ).pretty() // works fine
我如何强制Mongoose将每个查询字段括在花括号或任何其他想法中?
在您的查询中,该$elemMatch
对象不是另一个查询条件,而是输出字段选择(即投影)参数find
.
要在Mongoose中执行相同的操作,您可以执行以下操作:
PatientsModel.find({patientId: '123'}, {diet: {$elemMatch: {'status': 'A'}}}, cb)
要么
PatientsModel
.where('patientId', '123')
.select({diet: {$elemMatch: {'status': 'A'}})
.exec(cb);