【问题标题】:Mongoose pull ObjectId from arrayMongoose 从数组中拉出 ObjectId
【发布时间】:2018-08-05 21:08:25
【问题描述】:

我正在尝试做一个非常简单的操作,在 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",

提前致谢。

【问题讨论】:

  • 你试过User.findOneAndUpdate(fromUserId, { "$pull": { "linkedUsers": idToDelete } }, { "new": true }, callback);吗?
  • 刚刚做了,也没有运气。奇怪的是,在回调的第二个参数中,我得到了一个与用作参数的两个 Id 无关的用户。
  • 刚刚意识到我的错误,是指另一种方法User.findByIdAndUpdate(fromUserId, { "$pull": { "linkedUsers": idToDelete } }, { "new": true }, callback);User.findOneAndUpdate({ _id: fromUserId }, { "$pull": { "linkedUsers": idToDelete } }, { "new": true }, callback);
  • 两者都试过了,这次回调给了我正确的用户。但我可以看到 id 没有从数组中拉出。看来我不是唯一一个在苦苦挣扎的人:stackoverflow.com/questions/15625633/…
  • 就是这样!我已经更新了我的模型并使用了User.findOneAndUpdate( { _id: fromUserId }, { $pullAll: { linkedUsers: [idToDelete] } }, { new: true }, function(err, data) {} ); 你可以将你的评论设置为答案,以便我接受吗?非常感谢!

标签: mongodb mongoose


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    应该是:

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

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 2021-04-01
      • 2015-05-02
      • 2021-03-03
      • 2017-08-08
      • 2016-10-04
      • 2013-11-16
      • 2017-11-22
      • 2022-12-12
      相关资源
      最近更新 更多