meteor mongodb upsert 嵌套对象数组与 _id

meteor mogodb upsert a nested array of object with _id

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 并为上下文添加了更多代码

经过大量试验和错误后,我在流星文档 (https://docs.meteor.com/api/collections.html#Mongo-Collection-rawCollection) 中发现 collection.rawcollection() 给出了来自流星包装器的实际集合对象。因此,将拉对象从数组代码更改为以下对我有用

 PkgsCollection.rawCollection().update(
      { _id: pkgId },
      {
        $pull: {
          services: {
            _id: serviceId,
          },
        },
      }
    );