【发布时间】:2021-10-03 18:27:11
【问题描述】:
mongo 版本:4.4.4
在我的meteorJs 应用程序中,我有一个名为packages 的集合,我想根据其_id“更新”services 对象数组。经过研究,我发现一种方法是从数组中拉出对象,然后将对象推送到数组中
这就是我现在的做法
function updatePackage(pkgId = 'cKB6gkvP76HYiDs7W', serviceId = "e8RfhPdAh2rpsJPFb"){
const service = ServicesCollection.findOne({
_id: serviceId,
});
PkgsCollection.update(
{ _id: pkgId },
{
$pull: {
services: {
_id: serviceId,
},
},
},
{ multi: true }
);
PkgsCollection.update(
{ _id: pkgId },
{
$push: {
services: service,
},
}
);
}
这目前不起作用,我的包集合最终如下:
{
"_id" : "cKB6gkvP76HYiDs7W",
"pkgName" : "pkg1",
"owner" : "own1",
"services" : [
{
"_id" : "e8RfhPdAh2rpsJPFb",
"serviceName" : "serv1",
},
{
"_id" : "e8RfhPdAh2rpsJPFb",
"serviceName" : "serv1",
}
],
}
但在 mongo shell 中,以下命令可以正常工作
db.pkgs.update(
{_id:"cKB6gkvP76HYiDs7W"},
{
$pull:{
services:{
_id:"e8RfhPdAh2rpsJPFb"
}
}
});
为什么这不起作用?有没有更好的方法在没有两个推拉操作的情况下在数组中更新对象?
编辑:将拼写错误 PkgsCollection.find 更新为 PkgsCollection.update 并添加更多上下文代码
【问题讨论】:
-
尝试使用async/await,将await放在
await PkgsCollection.update(之前 -
能否请您展示您的整个代码?您的第一条语句是
find,当然它不会拉任何东西,而在您的第二条语句中,您使用变量service,就好像我们要理解它是什么一样。 -
@ChristianFritz 我更新了代码并修正了错字
find。请告诉我您的建议 -
愚蠢的问题:为什么您的默认 serviceId 值与 pkgId 相同?
-
抱歉,我的错别字似乎不够多。又修好了!
标签: node.js mongodb meteor upsert