Mongoose从数组中拉出ObjectId

时间:2018-02-26 11:58:30

标签: mongodb mongoose

我尝试做一个非常简单的操作,在Mongo数据库中使用Mongoose从数组中提取项目,如下所示:

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

fromUserId& idToDelete都是对象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",

提前致谢。

2 个答案:

答案 0 :(得分:3)

您需要在架构定义中明确定义类型,即

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

答案 1 :(得分:3)

我有一个类似的问题。我想使用mongo中的默认_id从数组中删除对象,但查询错误:

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

应该是:

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