我正在尝试查询数据集合,以使用elemMatch从对象数组中仅返回一个对象。我有此数据:
[
{
"_id": "5ba10e24e1e9f4062801ddeb",
"user": {
"_id": "5b9b9097650c3414ac96bacc",
"firstName": "blah",
"lastName": "blah blah",
"email": "blah@gmail.com"
},
"appointments": [
{
"date": "2018-09-18T14:39:36.949Z",
"_id": "5ba10e28e1e9f4062801dded",
"treatment": "LVL",
"cost": 30
},
{
"date": "2018-09-18T14:39:32.314Z",
"_id": "5ba10e24e1e9f4062801ddec",
"treatment": "LVL",
"cost": 30
}
],
"__v": 1
}
]
我需要查询数据库,并根据传递给params的id只提取一个约会。我正在使用以下基于文档here的代码。
router.get(
"/booked/:app_id",
passport.authenticate("jwt", { session: false }),
(req, res) => {
Appointment.find()
.elemMatch("appointments", { id: req.params.app_id })
.then(app => res.json(app));
}
);
尽管当我用邮递员测试时,这将返回一个空数组。这是我第一次使用node.js和mongoDB,因此将不胜感激。谢谢。
答案 0 :(得分:1)
您正在使用elemmatch as query operator,但需要将其用作projection operator
将功能更改为此:
Appointment.find(
{"appointments": {$elemMatch: {_id: req.params.app_id }}},
{"appointments": {$elemMatch: {_id: req.params.app_id }}}
)
为什么要两次?
查找查询参数中的第一个对象是 $ elemmatch查询运算符。它将返回所有文档,其中在约会数组中至少有一个与_id匹配的条目。 (但会返回整个文档)
第二个对象(相同)是 elemmatch投影运算符,它“过滤”约会数组并仅返回数组中的第一个匹配元素。
PS:无法测试此命令。试一试