我正在尝试做一个非常简单的操作,在 Mongo 数据库上使用 Mongoose 从数组中提取一个项目,如下所示:
User.update({ _id: fromUserId }, { $pull: { linkedUsers: [idToDelete] } });
Run Code Online (Sandbox Code Playgroud)
fromUserId&idToDelete都是对象 ID。
用户的架构是这样的:
var UserSchema = new Schema({
groups: [],
linkedUsers: [],
name: { type: String, required: true, index: { unique: true } }
});
Run Code Online (Sandbox Code Playgroud)
linkedUsers 是一个只接收其他用户 ID 的数组。
我也试过这个:
User.findOne({ _id: fromUserId }, function(err, user) {
user.linkedUsers.pull(idToDelete);
user.save();
});
Run Code Online (Sandbox Code Playgroud)
但没有运气。
当我在不同位置控制数组的长度时,第二个选项似乎几乎可以工作,但在调用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();
});
Run Code Online (Sandbox Code Playgroud)
所以看起来我很接近但仍然没有运气。两个 ID 都是通过应用程序的前端发送的。我正在运行这些版本:
"mongodb": "^2.2.29",
"mongoose": "^5.0.7",
Run Code Online (Sandbox Code Playgroud)
提前致谢。
您需要在架构定义中明确定义类型,即
groups: [{ type: Schema.Types.ObjectId, ref: 'Group' }],
linkedUsers: [{ type: Schema.Types.ObjectId, ref: 'User' }]
Run Code Online (Sandbox Code Playgroud)
然后使用
User.findOneAndUpdate(
{ _id: fromUserId },
{ $pullAll: { linkedUsers: [idToDelete] } },
{ new: true },
function(err, data) {}
);
Run Code Online (Sandbox Code Playgroud)
或者
User.findByIdAndUpdate(fromUserId,
{ $pullAll: { linkedUsers: [idToDelete] } },
{ new: true },
function(err, data) {}
);
Run Code Online (Sandbox Code Playgroud)
小智 5
我有类似的问题。我想使用 mongo 中的默认 _id 从数组中删除一个对象,但我的查询是错误的:
const update = { $pull: { cities: cityId }};
Run Code Online (Sandbox Code Playgroud)
它应该是:
const update = { $pull: { cities: {_id: cityId} }};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4743 次 |
| 最近记录: |