流星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插入一个嵌套的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组插入 MongoDB

使用 MongoDB 更新嵌套数组

使用 MongoDB 更新嵌套数组

具有嵌套对象数组的 MongoDB 聚合

mongodb $查找带有投影的数组中的嵌套对象

MongoDB 嵌套对象数组后查询