从数组中删除ObjectId的Mongoose操作

10

我正在尝试进行一个非常简单的操作,使用Mongoose在Mongo数据库中从数组中提取一个项目,像这样:

User.update({ _id: fromUserId }, { $pull: { linkedUsers: [idToDelete] } });

fromUserIdidToDelete都是对象ID。

用户模式如下:

var UserSchema = new Schema({
  groups: [],
  linkedUsers: [],
  name: { type: String, required: true, index: { unique: true } }
});

linkedUsers 是一个只接收其他用户 Id 的数组。

我也尝试过这个方法:

User.findOne({ _id: fromUserId }, function(err, user) {
  user.linkedUsers.pull(idToDelete);
  user.save();
});

但是没有运气。

当我在不同的位置控制数组的长度时,第二个选项似乎几乎能够工作,但是在调用 save 并检查之后,长度仍然为36:

 User.findOne({ _id: fromUserId }, function(err, user) {
    console.log(user.linkedUsers.length); // returns 36
    user.linkedUsers.pull(idToDelete);
    console.log(user.linkedUsers.length); // returns 35
    user.save();
  });

看起来我很接近了,但还是没有运气。这两个ID都是通过应用程序的前端发送的。

我正在运行以下版本:

"mongodb": "^2.2.29",
"mongoose": "^5.0.7",

先行致谢。


你试过这样写吗?User.findOneAndUpdate(fromUserId, { "$pull": { "linkedUsers": idToDelete } }, { "new": true }, callback); - chridam
刚刚尝试了一下,但还是没有成功。奇怪的是,在回调函数的第二个参数中,我得到了一个与作为参数使用的两个ID无关的用户。 - kevin
刚刚意识到我的错误,是指另一种方法 User.findByIdAndUpdate(fromUserId, { "$pull": { "linkedUsers": idToDelete } }, { "new": true }, callback); 或者 User.findOneAndUpdate({ _id: fromUserId }, { "$pull": { "linkedUsers": idToDelete } }, { "new": true }, callback); - chridam
尝试了两种方法,这次回调函数给我返回了正确的用户。但是我发现id没有从数组中获取。看起来我不是唯一遇到问题的人:https://dev59.com/N3DXa4cB1Zd3GeqP8x8D?rq=1 - kevin
1
就是这样!我已经更新了我的模型并使用了 User.findOneAndUpdate( { _id: fromUserId }, { $pullAll: { linkedUsers: [idToDelete] } }, { new: true }, function(err, data) {} ); 你能把你的评论设为答案,这样我就可以接受它了吗?非常感谢! - kevin
显示剩余4条评论
2个回答

10

您需要在模式定义中明确定义类型,即:

groups: [{ type: Schema.Types.ObjectId, ref: 'Group' }], 
linkedUsers: [{ type: Schema.Types.ObjectId, ref: 'User' }]
User.findOneAndUpdate( 
    { _id: fromUserId }, 
    { $pullAll: { linkedUsers: [idToDelete] } }, 
    { new: true }, 
    function(err, data) {} 
);
或者
User.findByIdAndUpdate(fromUserId, 
    { $pullAll: { linkedUsers: [idToDelete] } }, 
    { new: true }, 
    function(err, data) {} 
);

5

我遇到了类似的问题。我想使用Mongo的默认_id从数组中删除一个对象,但我的查询语句是错误的:

const update = { $pull: { cities: cityId }};

应该是:

const update = { $pull: { cities: {_id: cityId} }};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接