javascript - 使用 elemMatch 从数组 Node.js 返回一个对象

标签 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
}
]

我需要查询数据库并根据传递给参数的 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));
 }
);

当我用 postman 测试时,这返回一个空数组。这是我第一次使用 Node.js 和 mongoDB,因此我们将不胜感激。谢谢。

最佳答案

您正在使用 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:无法测试此命令。站在你这边试试

关于javascript - 使用 elemMatch 从数组 Node.js 返回一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52442069/

相关文章:

javascript - jquery cycle 将隐藏功能更改为禁用

node.js - 部署到 Heroku 时无法使用 Google OAuth 登录

node.js - 如何在 mongodb 中推送一个新文档,但前提是它不存在?

javascript - 输入类型 'number' 的 ng-model 不工作

javascript - 根据键中的子字符串将对象转换为对象数组

javascript - JS 如何让 <main> 元素在页面加载时聚焦

node.js - Node js获取socket.io的js

javascript - nodejs hello world 示例 - 符号查找错误

performance - MongoDB 按许多参数过滤(复合索引或不复合索引)

mongodb - 将插件安装到Logstash时发生ELK错误