mongodb - Mongoose 从数组中提取 ObjectId

标签 mongodb mongoose

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

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",

提前致谢。

最佳答案

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

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

关于mongodb - Mongoose 从数组中提取 ObjectId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48988019/

相关文章:

forms - Mongoose 的 express.js 表单模块

javascript - 如何使用 Mongoose 更新嵌套对象

node.js - 如何在 MEAN 堆栈应用程序中从后端到前端进行通信?

javascript - 计算数组元素中的键

MongoDB:根据$或值的顺序查找一个文档?

mongodb - 如果我使用 norm 或 csharp-mongodb 驱动程序,如何在 mongodb 中添加新字段

mongodb - 将项目推送到数组并在同一请求中删除

javascript - 如何使用自定义日期格式的 find() 方法从集合中检索数据

javascript - Mongoose 找到很多并更新所有

node.js - 更新 Mongodb 中嵌套数组内的对象