【问题标题】:Mongoose deleting (pull) a document within an array, does not work with ObjectIDMongoose 删除(拉)数组中的文档,不适用于 ObjectID
【发布时间】:2013-11-16 03:43:10
【问题描述】:

我有以下猫鼬模式:

user = {
    "userId" : "myId",
    "connections":
    [{
        "dateConnectedUnix": 1334567891,
        "isActive": true
    }, {
        "dateConnectedUnix": 1334567893,
        "isActive": false
    }]
}

我想删除connections数组中的第二项,得到如下:

user = {
    "userId" : "myId",
    "connections": 
    [{
        "dateConnectedUnix": 1334567893,
        "isActive": false
    }]
}

以下代码按预期完成工作:

userAccounts.update(
    { 'connections.isActive': false }, 
    { $pull: { 'connections.isActive':false }}, 
    function (err, val) {
        console.log(val)
    }
);

但是,我需要根据 ObjectId 删除。以下内容不起作用:

userAccounts.update(
    { 'connections._id': '1234-someId-6789' }, 
    { $pull: { 'connections._id': '1234-someId-6789' } },
    function (err, val) {
        console.log(val)
    }
);

有什么建议吗?几个小时以来,我一直在用头撞屏幕(又名 Google、Stackoverflow,...),但运气不佳。

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

上面的代码好像不行。它甚至不应该适用于我给出的第一个示例。

最后我在这里得到了这个答案的支持:MongoDB, remove object from array

这是我的工作代码:

userAccounts.update( 
    { userId: usr.userId },
    {
        $pull: {
            connections: { _id : connId }
        }
    },
    { safe: true },
    function removeConnectionsCB(err, obj) {
        // ...
    }
);

【讨论】:

  • and connId and usr.userId is an instanceof ObjectId?
  • 我以为safe: true 是默认设置的?
【解决方案2】:

我有一个类似的文件

我必须从地址数组中删除地址

在网上搜索了很多后,我找到了解决方案

Customer.findOneAndUpdate(query, {$pull: {address: addressId}}, (err, data) => {
    if (err) {
        return res.status(500).json({ error: 'error in deleting address' });
    }
    res.json(data);   
});

【讨论】:

  • 完全相同的问题,但对我不起作用。这是什么版本的mongodb?
  • 您的查询和路由 url 是什么?如果在addressId是动态的
  • 你应该像这样Customer.findOneAndUpdate(query, {$pull: {address: mongoose.Type.ObjectId(addressId)}}, (err, data) => { if (err) { return res.status(500).json({ error: 'error in deleting address' }); } res.json(data); });进行更新查询
【解决方案3】:
user: {
 _id: ObjectId('5ccf3fa47a8f8b12b0dce204'),
 name: 'Test',
 posts: [
  ObjectId("5cd07ee05c08f51af8d23b64"),
  ObjectId("5cd07ee05c08f51af8d23c52")
 ]
}

从帖子数组中删除单个帖子

user.posts.pull("5cd07ee05c08f51af8d23b64"); user.save();

【讨论】:

  • 如果您要更新找到的文档,这是最好的选择。
  • 同样的事情对我没用,没有错误,只是没用,有什么线索吗??
【解决方案4】:

要对 ObjectId 使用更新,您应该使用 ObjectId 对象而不是字符串表示:

var ObjectId = require('mongoose').Types.ObjectId;

userAccounts.update(
    { 'connections._id': new ObjectId('1234-someId-6789') }, 
    { $pull: { 'connections._id': new ObjectId('1234-someId-6789') } }, 
    function (err,val) {
        console.log(val)
    }
);

【讨论】:

  • 感谢您的回答。从技术上讲,我认为你是对的。但我实际上是使用有效的 ObjectId JSON 格式引用我的代码。我已经发布了自己的答案。
  • 我认为您的代码有点误导。例如在第 3 行中,您写了connections_.id,而实际上原始问题清楚地表明connections 是一个对象数组,没有附加_id 属性。
【解决方案5】:

使用findByIdAndUpdate 从数组中删除一个项目

你可以在 mongoose 5.4.x and above

const result = await User.findByIdAndUpdate(user_id, {
    $pull: {
        someArrayName: { _id: array_item_id }
    }
}, { new: true });

if (result)
    console.log(result)

将根据提供的属性_id 值从数组中删除项目

【讨论】:

    【解决方案6】:

    猫鼬:4.11.11
    对我有用的是以下语法:

    const removeTansactionFromUser = (userId, connectionId) => {
        return User.findByIdAndUpdate(userId, { $pull: { "connections": connectionId} }, {'new': true} );
    };
    

    Mongoose 支持字符串格式或 ObjectId 格式的 id。
    提示:new ObjectId(stringId) 从字符串切换到 ObjectId

    【讨论】:

      【解决方案7】:

      在 mongoose 5.8.11 中,这个 $pull: { ... } 对我不起作用,目前不知道为什么。所以我以这种方式在我的控制器中克服了它:

      exports.removePost = async (req, res, next) => {
        const postId = req.params.postId;
        try {
          const foundPost = await Post.findById(postId);
          const foundUser = await User.findById(req.userId);
          if (!foundPost || !foundUser) {
            const err = new Error(
              'Could not find post / user.',
            );
            err.statusCode = 404;
            throw err;
          }
          // delete post from posts collection:
          await Post.findByIdAndRemove(postId);
          // also delete that post from posts array of id's in user's collection:
          foundUser.posts.pull({ _id: postId });
          await foundUser.save();
          res.status(200).json({ message: 'Deleted post.' });
        } catch (err) {
          // ...
        }
      };
      

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 2021-04-01
        • 2021-02-10
        • 2018-08-05
        • 2016-10-04
        • 1970-01-01
        • 2019-01-01
        • 2014-12-02
        • 2022-01-08
        相关资源
        最近更新 更多