如何在mongodb中查询文档数组的元素



我花了整个晚上的时间试图弄清楚这一点,我在数据库中有这样的用户:

[
{
"_id": "5fcff6ed224670346c8b60de",
"name": "john",
"password": "147",
"data": [
{
"_id": "5fd000356d5df538d0338db4",
"comment": "comment1",
"date": "2020-12-08T22:37:41.740Z"
},
{
"_id": "5fd0003e6d5df538d0338db6",
"comment": "comment2",
"date": "2020-12-08T22:37:50.271Z"
},
{
"_id": "5fd000476d5df538d0338dba",
"comment": "comment3",
"date": "2020-12-08T22:37:59.128Z"
}
],
"__v": 6
},
{
"_id": "5fcff6f5224670346c8b60df",
"name": "Samantha",
"password": "123",
"data": [],
"__v": 0
},
]

当用户";约翰;登录了,他想检索1号评论,我该怎么做?

我想好了如何删除它,但不知道如何检索

router.delete("/:id", auth, async (req, res) => {
let user = await User.findByIdAndUpdate(
req.user._id,
{
$pull: {
data: { _id: req.params.id },
},
},
{ new: true }
);
res.send(user.data);
});

我甚至放弃了,试图只检索整个用户,然后过滤数据,但不起作用

router.get("/:id", auth, async (req, res) => {
let user = await User.findById(req.user._id);
let arr = user.data
arr = arr.filter(e => e._id === req.params.id)
res.send(arr)
});

您可以像这样使用查询和投影:

db.getCollection('users').find({
"data": {
$elemMatch: {
comment: "comment1"
}
},
"name": "john"
},
{
"data.$": 1
})

使用$elemMatch,您可以在嵌入文档中指定多个条件

然后,您将结果投影为只返回条件为
{comment: "comment1"}{name: "john"}的第一个元素

您将得到只有一个索引的数据数组,这正是您所要求的。

最新更新