【问题标题】:meteor mogodb upsert a nested array of object with _id流星mongodb用_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 相同?
  • 抱歉,我的错别字似乎不够多。又修好了!

标签: node.js mongodb meteor upsert


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多