Mongoose删除(拉)数组中的文档,不适用于ObjectID

时间:2013-11-05 09:54:31

标签: node.js mongodb mongoose

我有以下mongoose架构:

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)
                    });

有什么建议吗?我一直在屏幕上撞击屏幕(又名谷歌,Stackoverflow,......)几个小时,没有运气。

7 个答案:

答案 0 :(得分:36)

似乎上面的代码不起作用。它甚至不应该用于我给出的第一个例子。

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

这是我的工作代码:

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

答案 1 :(得分:14)

我有一个像

这样的文件

enter image description here

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

在互联网上搜索后,我找到了解决方案

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

        res.json(data);

      });

答案 2 :(得分:8)

要使用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)
                });

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

您可以在 mongoose 5.4.x

中进行操作
const result = await User.findByIdAndUpdate(user_id,
            {
                $pull: {
                    connections: { _id: con_id }
                }
            }, { new: true });


if (result)
    console.log(result)

根据提供的属性item的值,将删除connections数组中的_id

答案 5 :(得分:0)

user: {
 _id: ObjectId('5ccf3fa47a8f8b12b0dce204'),
 name: 'Test',
 posts: [
  ObjectId("5cd07ee05c08f51af8d23b64"),
  ObjectId("5cd07ee05c08f51af8d23c52")
 ]
}

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

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

答案 6 :(得分:0)

在猫鼬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) {
    // ...
  }
};