【发布时间】:2021-05-23 22:29:17
【问题描述】:
我有一个 Node.js 应用程序,我在其中尝试在 API 端点被命中时从数组中删除一个对象。到目前为止,我一直无法让它更新/删除对象。目前,以下查询返回没有错误,但在检查我的数据库时,我仍然看到它。以下是我的查询和基本回复(我将添加更多内容,但这超出了本问题的范围)。我还包含了我的数据模型的示例。 在下面的数据模型中,我试图从 foo 数组中删除整个对象,因为它不再需要了。 代码
const ID = req.params.id
await FooBar.updateOne({foo: {$elemMatch: {v_code: ID}}}, { $pull: {v_code: ID}}, (err) => {
if(err) return res.json({success: false, err})
return res.json({success: true, id: ID})
})
数据模型
{
bar: [
{
foo: [
{
v_code: <>
_id: <>
}
]
}
]
}
我确定在其他问题中已经提出了这个问题,但没有针对我的数据模型。我尝试将多个 SO 帖子拼凑在一起,这就是我得到查询的 $elemmatch 和 $pull 部分的方式,到目前为止我的运气为零
【问题讨论】:
-
查看docs 中的示例以获取匹配和修改的文档数量。您的查询是否匹配任何文档?
-
@Joe 它应该匹配一个文档,我已经检查了 mongo atlas 控制台,看到一个具有我要查找的键的正确值的那个。我只是按照您的建议进行操作并尝试查看返回的文档数,它显示为 0。不知道为什么,我已经确认键/值是有效的,尽管可能是因为元素不是顶级元素?我不能直接在
elemmeatch中定位v_code,因为它也出现在(不同的值)foo的旧值数组中 -
MongoDB 查询运算符是类型敏感的。确保
ID的类型与数据库中的数据类型匹配。从数据模型看来foo嵌套在bar中,你试过匹配{"bar.foo.v_code": ID}吗? -
@Joe 两者都是这样认为的字符串,只是对 console.log 做了一个小测试来确认,我是正确的
-
可能选择器对查询无效?
标签: javascript node.js mongodb mongoose