使用elemMatch从数组node.js返回一个对象

时间:2018-09-21 10:48:24

标签: javascript node.js mongodb express

我正在尝试查询数据集合,以使用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,因此将不胜感激。谢谢。

1 个答案:

答案 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:无法测试此命令。试一试