流星mongodb用_id插入一个嵌套的对象数组
Posted
技术标签:
【中文标题】流星mongodb用_id插入一个嵌套的对象数组【英文标题】:meteor mogodb upsert a nested array of object with _id 【发布时间】: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 相同?
抱歉,我的错别字似乎不够多。又修好了!
【参考方案1】:
经过大量试验和错误,我在流星文档 (https://docs.meteor.com/api/collections.html#Mongo-Collection-rawCollection) 中发现collection.rawcollection()
给出了流星包装器中的实际集合对象。因此,将 pull 对象从数组代码更改为以下代码对我有用
PkgsCollection.rawCollection().update(
_id: pkgId ,
$pull:
services:
_id: serviceId,
,
,
);
【讨论】:
以上是关于流星mongodb用_id插入一个嵌套的对象数组的主要内容,如果未能解决你的问题,请参考以下文章