我正在尝试执行一个非常简单的操作,从蒙古数据库上带有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();
});
但是没有运气。
当我安装不同位置的数组的lenghts时,第二个选项似乎几乎可以起作用,但是在致电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) {}
);
我也有类似的问题。我想使用Mongo的默认_id从数组中删除一个对象,但是我的查询是错误的:
const update = { $pull: { cities: cityId }};
应该是:
const update = { $pull: { cities: {_id: cityId} }};