Javascript 使用elemMatch从array node.js返回一个对象

Javascript 使用elemMatch从array node.js返回一个对象,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我正在尝试查询数据集合,以便使用elemMatch从对象数组中仅返回一个对象。我有以下数据: [ { "_id": "5ba10e24e1e9f4062801ddeb", "user": { "_id": "5b9b9097650c3414ac96bacc", "firstName": "blah", "lastName": "blah blah", "email": "blah@gmail.com" },

我正在尝试查询数据集合,以便使用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
}
]
我需要查询DB并根据传递给params的id仅取出一个约会。我根据文档使用下面的代码

不过,当我使用postman进行测试时,返回的是一个空数组。这是我第一次使用node.js和mongoDB,希望您能提供帮助。谢谢。

您正在使用,但您需要将其用作

将您的功能更改为:

Appointment.find(
  {"appointments": {$elemMatch: {_id: req.params.app_id }}},
  {"appointments": {$elemMatch: {_id: req.params.app_id }}}
)
为什么要两次??

find query param中的第一个对象是$elemmatch查询运算符。它将返回所有文档,其中至少有一个条目与数组中的_id匹配。(但将返回全部文件)

第二个对象(相同)是elemmatch projection oprator,它“过滤”数组并仅返回数组中的第一个匹配元素

PS:无法测试此命令。试着站在你这边

你正在使用,但你需要像

将您的功能更改为:

Appointment.find(
  {"appointments": {$elemMatch: {_id: req.params.app_id }}},
  {"appointments": {$elemMatch: {_id: req.params.app_id }}}
)
为什么要两次??

find query param中的第一个对象是$elemmatch查询运算符。它将返回所有文档,其中至少有一个条目与数组中的_id匹配。(但将返回全部文件)

第二个对象(相同)是elemmatch projection oprator,它“过滤”数组并仅返回数组中的第一个匹配元素


PS:无法测试此命令。站在你这边试试

你错过了id:.elemMatch(“约会”{{u id:req.params.app_id})之前的下划线谢谢@matthPen指出这一点,愚蠢的错误!唯一的问题是,更改后,它现在返回整个数据收集,而不仅仅是我需要的一个约会。好的,您只需要匹配的第一个数组值,就这样?需要/可能有多个结果,或者每个数组的第一个/唯一的结果就足够了?我需要一个结果,它将是一个ID为的约会,该ID是从参数中查询到的。可能的重复项您错过了ID之前的下划线:。elemMatch(“约会”,{u ID:req.params.app_ID})感谢@matthPen指出这一点,愚蠢的错误!唯一的问题是,更改后,它现在返回整个数据收集,而不仅仅是我需要的一个约会。好的,您只需要匹配的第一个数组值,就这样?需要/可能有多个结果,或者每个数组的第一个/唯一的结果就足够了?我需要一个结果,它将是一个ID为的约会,该ID是从Brilliant的参数中查询到的,这可能是重复的,成功了,感谢您的回答和解释!为什么不接受复制的原因,真的吗?那是个意外!太棒了,这很有效,谢谢你的回答和解释!为什么不接受复制的原因,真的吗?那是个意外!