【问题标题】:Remove object from nested array in MongoDB using NodeJS使用 NodeJS 从 MongoDB 中的嵌套数组中删除对象
【发布时间】:2022-06-10 18:42:51
【问题描述】:

我可以看到这个问题应该在这里得到回答,但是代码根本不适合我(我尝试了多种类似的变体)。

这是我的数据:

[{
  "_id": {
    "$oid": "628cadf43a2fd997be8ce242"
  },
  "dcm": 2,
  "status": true,
  "comments": [
    {
      "id": 289733,
      "dcm": 2,
      "status": true,
      "clock": "158",
      "user": "Nathan Field",
      "dept": "IT",
      "department": [],
      "dueback": "",
      "comment": "test 1"
    },
    {
      "id": 289733,
      "dcm": 2,
      "status": true,
      "clock": "158",
      "user": "Nathan Field",
      "dept": "IT",
      "department": [],
      "dueback": "",
      "comment": "test 2"
    }
  ],
  "department": [],
  "dueback": ""
}]

这是我的代码

const deleteResult = await db.collection('status').updateOne(
            { "dcm": comments.dcm },
            { $pull: { "comments": { "id": comments.id } } },
            { upsert: false },
            { multi: true }
        );

什么都没有发生……

【问题讨论】:

  • 我刚刚尝试了您的数据和更新表达式,它在匹配dcm 后从comments 数组中删除了目标id。我怀疑你传入的参数不是他们看起来的那样。
  • 检查数据类型确定,可能dcmcomments.id是字符串,默认也是upsert false,如果你选择了updateOne,去掉multi true。如果要更新很多,请使用 updateMany
  • dcmcomments.id 在 MongoDB Compass 中都显示为 Int32。我在所有变体中都尝试了带撇号和不带撇号。

标签: node.js arrays mongodb object


【解决方案1】:

所以问题最终与在一个函数中运行多个更新操作有关。我有一个这样的数据库连接函数:

const withDB = async (operations, res) => {
    try {
        const client = await MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true });
        const db = client.db('collection');
        await operations(db);
        client.close();
    } catch (error) {
        res.status(500).json({ message: 'Error connecting to db', error });
    }
}

然后我使用:

withDB(async (db) => {
    await db.collection('status').updateMany(
        { "dcm": comments.dcm },
        { $pull: { "comments": { "id": comments.id } } }, 
        { multi: true }
    );
});

问题的出现似乎是因为我在一个 withDB 函数中有两个这样的更新操作。我在其他实例中有多个操作(更新项目,然后获取集合),但由于某种原因,这导致了问题。

我创建了一个对 withDB 函数的单独调用来执行“$pull”(删除)请求,然后用新的 cmets 更新了数组。

为了检查我的实际查询是否有问题,我使用了 Studio3T 的 IntelliShell 功能。如果我早点这样做,我会为自己节省很多时间!

【讨论】:

    【解决方案2】:

    你可以试试这个。

    { $pull: { "comments": { "id": ObjectId(comments.id) } } },
    

    我希望它能解决问题。

    【讨论】:

    • comments.id 似乎是 int,而不是 ObjectId
    • 您在过滤查询时尝试过console.log 吗?我认为您需要先过滤查询。那么剩下的就可以了。
    • comments.id 是一个int,这是正确的。您能否提供一个代码示例来说明您建议如何首先进行过滤?
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 2020-12-20
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多