如何使用ExpressJS和MongoDB过滤对象的子值?

uurity8g  于 2023-02-21  发布在  Go
关注(0)|答案(1)|浏览(98)

我有一个数据从MongoDB那里我得到了代理的所有数据,我想得到的testimonialsisDisplayed是唯一的真.有没有办法在ExpressJS & MongoDB中,我可以过滤的证明密钥?
我是这么试的

const getSingleAgent = expressAsync(async (req, res) => {
  const agent = await Agents.findOne({
    _id: req.params.id,
  });

  res.json(agent);

  } else {
    res.status(404);
    throw new Error("Agent not found.");
  }
});

实际结果

{
    "_id": "63ea901a85d4fbd62fb887b3",
    "name": "test namee",
    "isDeclined": false,
    "testimonials": [
        {
            "isDisplayed": true,
            "name": "test123123123123123",
        },
        {
            "isDisplayed": false,
            "name": "test123123123123123",
        },
        {
            "isDisplayed": false,
            "name": "test@gmail.com",
        },
    ],
}

预期结果

{
    "_id": "63ea901a85d4fbd62fb887b3",
    "name": "test namee",
    "isDeclined": false,
    "testimonials": [
        {
            "isDisplayed": true,
            "name": "test123123123123123",
        },
    ],
}
pcww981p

pcww981p1#

您可以将$elemMatch用于投影阶段,如下所示:

db.collection.find({
  "_id": "63ea901a85d4fbd62fb887b3",
  "testimonials.isDisplayed": true
},
{
  "name": 1,
  "isDeclined": 1,
  "testimonials": {
    "$elemMatch": {
      "isDisplayed": true
    }
  }
})

示例here
但是要小心。使用$elemMatch只会返回第一个匹配项。看看this example,其中有两个true,但只返回一个。
如文件所述:
$elemMatch运算符将查询结果中字段的内容限制为仅包含与$elemMatch条件匹配的第一个元素。
因此,如果您拥有或想要多个值,可以使用pipelina和$filter并将其聚合到$project阶段中:

db.collection.aggregate([
  {
    "$match": {
      "_id": "63ea901a85d4fbd62fb887b3",
      "testimonials.isDisplayed": true
    }
  },
  {
    "$project": {
      "name": 1,
      "isDeclined": 1,
      "testimonials": {
        "$filter": {
          "input": "$testimonials",
          "cond": {
            "$eq": [
              "$$this.isDisplayed",
              true
            ]
          }
        }
      }
    }
  }
])

示例here
请注意,如果this example中存在两个true值,则两个值都显示。

相关问题