我有以下mongoose架构:
user = {
"userId" : "myId",
"connections":
[{
"dateConnectedUnix": 1334567891,
"isActive": true
}, {
"dateConnectedUnix": 1334567893,
"isActive": false
}]
}
我想删除connections
数组中的第二项,以获得以下内容:
user = {
"userId" : "myId",
"connections":
[{
"dateConnectedUnix": 1334567893,
"isActive": false
}]
}
以下代码按预期完成工作:
userAccounts.update({'connections.isActive': false },
{$pull: { 'connections.isActive':false }},
function (err,val) {
console.log(val)
});
但是,我需要基于ObjectId删除。以下行为不起作用:
userAccounts.update({'connections._id': '1234-someId-6789' },
{$pull: { 'connections._id': '1234-someId-6789' }},
function (err,val) {
console.log(val)
});
有什么建议吗?我一直在屏幕上撞击屏幕(又名谷歌,Stackoverflow,......)几个小时,没有运气。
答案 0 :(得分:36)
似乎上面的代码不起作用。它甚至不应该用于我给出的第一个例子。
最后,我得到了这个答案的支持:MongoDB, remove object from array
这是我的工作代码:
userAccounts.update(
{ userId: usr.userId },
{ $pull: { connections : { _id : connId } } },
{ safe: true },
function removeConnectionsCB(err, obj) {
...
});
答案 1 :(得分:14)
我有一个像
这样的文件我必须从地址数组中删除地址
在互联网上搜索后,我找到了解决方案
Customer.findOneAndUpdate(query, {$pull: {address: addressId}}, function(err, data){
if(err) {
return res.status(500).json({'error' : 'error in deleting address'});
}
res.json(data);
});
答案 2 :(得分:8)
要使用ObjectId进行更新,您应该使用ObjectId对象而不是字符串表示:
var ObjectId = require('mongoose').Types.ObjectId;
userAccounts.update({'connections._id': new ObjectId('1234-someId-6789') },
{$pull: { 'connections._id': new ObjectId('1234-someId-6789') }},
function (err,val) {
console.log(val)
});
答案 3 :(得分:1)
const removeTansactionFromUser = (userId, connectionId) => {
return User.findByIdAndUpdate(userId, { $pull: { "connections": connectionId} }, {'new': true} );
};
字符串格式或ObjectId格式的Mongoose支持ID
提示:new ObjectId(stringId)
从字符串切换到ObjectId
答案 4 :(得分:0)
您可以在 mongoose 5.4.x
const result = await User.findByIdAndUpdate(user_id,
{
$pull: {
connections: { _id: con_id }
}
}, { new: true });
if (result)
console.log(result)
根据提供的属性item
的值,将删除connections
数组中的_id
答案 5 :(得分:0)
user: {
_id: ObjectId('5ccf3fa47a8f8b12b0dce204'),
name: 'Test',
posts: [
ObjectId("5cd07ee05c08f51af8d23b64"),
ObjectId("5cd07ee05c08f51af8d23c52")
]
}
从帖子数组中删除单个帖子
user.posts.pull("5cd07ee05c08f51af8d23b64");
user.save();
答案 6 :(得分:0)
在猫鼬5.8.11中,此$pull: { ... }
对我不起作用,到目前为止尚不确定原因。因此,我以这种方式在控制器中克服了它:
exports.removePost = async (req, res, next) => {
const postId = req.params.postId;
try {
const foundPost = await Post.findById(postId);
const foundUser = await User.findById(req.userId);
if (!foundPost || !foundUser) {
const err = new Error(
'Could not find post / user.',
);
err.statusCode = 404;
throw err;
}
// delete post from posts collection:
await Post.findByIdAndRemove(postId);
// also delete that post from posts array of id's in user's collection:
foundUser.posts.pull({ _id: postId });
await foundUser.save();
res.status(200).json({ message: 'Deleted post.' });
} catch (err) {
// ...
}
};