Mongoose 删除(拉)数组中的文档,不适用于 ObjectID
Posted
技术标签:
【中文标题】Mongoose 删除(拉)数组中的文档,不适用于 ObjectID【英文标题】:Mongoose deleting (pull) a document within an array, does not work with ObjectID 【发布时间】:2013-11-16 03:43:10 【问题描述】:我有以下猫鼬模式:
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)
);
有什么建议吗?几个小时以来,我一直在用头撞屏幕(又名 Google、***,...),但运气不佳。
【问题讨论】:
谁能帮帮我:***.com/questions/49124014/… 类似的问题:( 【参考方案1】:上面的代码好像不行。它甚至不应该适用于我给出的第一个示例。
最后我在这里得到了这个答案的支持:MongoDB, remove object from array
这是我的工作代码:
userAccounts.update(
userId: usr.userId ,
$pull:
connections: _id : connId
,
safe: true ,
function removeConnectionsCB(err, obj)
// ...
);
【讨论】:
andconnId
and usr.userId
is an instanceof ObjectId
?
我以为safe: true
是默认设置的?【参考方案2】:
我有一个类似的文件
我必须从地址数组中删除地址
在网上搜索了很多后,我找到了解决方案
Customer.findOneAndUpdate(query, $pull: address: addressId, (err, data) =>
if (err)
return res.status(500).json( error: 'error in deleting address' );
res.json(data);
);
【讨论】:
完全相同的问题,但对我不起作用。这是什么版本的mongodb? 您的查询和路由 url 是什么?如果在addressId
是动态的
你应该像这样Customer.findOneAndUpdate(query, $pull: address: mongoose.Type.ObjectId(addressId), (err, data) => if (err) return res.status(500).json( error: 'error in deleting address' ); res.json(data); );
进行更新查询【参考方案3】:
user:
_id: ObjectId('5ccf3fa47a8f8b12b0dce204'),
name: 'Test',
posts: [
ObjectId("5cd07ee05c08f51af8d23b64"),
ObjectId("5cd07ee05c08f51af8d23c52")
]
从帖子数组中删除单个帖子
user.posts.pull("5cd07ee05c08f51af8d23b64");
user.save();
【讨论】:
如果您要更新找到的文档,这是最好的选择。 同样的事情对我没用,没有错误,只是没用,有什么线索吗??【参考方案4】:要对 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)
);
【讨论】:
感谢您的回答。从技术上讲,我认为你是对的。但我实际上是使用有效的 ObjectId JSON 格式引用我的代码。我已经发布了自己的答案。 我认为您的代码有点误导。例如在第 3 行中,您写了connections_.id
,而实际上原始问题清楚地表明connections
是一个对象数组,没有附加_id
属性。【参考方案5】:
使用findByIdAndUpdate
从数组中删除一个项目
你可以在 mongoose 5.4.x and above
const result = await User.findByIdAndUpdate(user_id,
$pull:
someArrayName: _id: array_item_id
, new: true );
if (result)
console.log(result)
将根据提供的属性_id
值从数组中删除项目
【讨论】:
【参考方案6】:猫鼬:4.11.11 对我有用的是以下语法:
const removeTansactionFromUser = (userId, connectionId) =>
return User.findByIdAndUpdate(userId, $pull: "connections": connectionId , 'new': true );
;
Mongoose 支持字符串格式或 ObjectId 格式的 id。
提示:new ObjectId(stringId)
从字符串切换到 ObjectId
【讨论】:
【参考方案7】:在 mongoose 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)
// ...
;
【讨论】:
以上是关于Mongoose 删除(拉)数组中的文档,不适用于 ObjectID的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose Populate 不适用于 ObjectIds 数组
Node.js/mongoose - 数组中的子文档不会删除/移除
Node.js/mongoose - 数组中的子文档不会删除/移除