【问题标题】:Id not getting removed from nested arrayId 没有从嵌套数组中删除
【发布时间】:2019-10-30 23:52:50
【问题描述】:

您好,我正在尝试从文档中删除嵌套数组对象 id,但它没有被删除。虽然我收到消息"Deleted"

我有一个结构是:-

{
    "admins": {
        "users": [
            "5d0364048db4957100f33fea" //<===want to delete this relational id
        ],
        "email": "1cf1eede89@himail.online",
        "password": "$2a$10$vHyGxX9P.t0/ybKcmIzkc.ZCX18oHaVnvTgJIWA2gTNzJ3TCdXS4a",
    "_id": "5d0339d5b4b28b6ddff06802",
    "companyName": "GH",
    "__v": 0
}

我想从数组中删除users _id

我试过了,但它没有被删除。

router.delete('/userDelete/:uId', checkAuth , (req, res, next) =>{
    if(req.userData.role2 === 'admin') {
        Admin.findOneAndUpdate({ _id: req.params.userId },{ $pull: { 'admins.users': req.params.uId}}) 
        .exec()
        .then(result => {
            res.status(200).send(["Deleted"]);
        })
        .catch(err =>{
        if (err.code == 500)
                    res.status(500).send(["Didn't get deleted"]);
        else
            return next(err);
        });

控制器是这样的:-

var admin = new Admin();
    admin.companyName = req.body.companyName;
    admin.admins = {
                    email : req.body.email,
                    password: req.body.password,
                    users : [] 
    };

我被困在这里,我必须在路线上做些什么改变?

编辑:- DB 是这样的

【问题讨论】:

  • 控制台result
  • @mehta-rohan 为空
  • 这意味着您搜索记录的查询不起作用
  • 我没有看到任何参数userId。我看到的唯一参数是uId
  • @mehta-rohan 是的,我知道了,但我找不到解决方案

标签: node.js mongodb express mongoose mongoose-schema


【解决方案1】:

问题出在Admin.findOneAndUpdate({ _id: req.params.userId }

req.params.userId未定义,因为它不存在于您的路径中。 req.params 对象只拥有一个属性,uId。 因此,您的查询找不到任何数据。
如果您的方法路由具有类似 router.delete('/userDelete/:userId/:uId) 的形式,req.params.userId 将具有价值。
因此,您可以在删除请求的 url 中添加 userId 并通过 req.params 对象访问它。新的url应该是这样的

/userDelete/userId/uId

(例如)

userDelete/5d0339d5b4b28b6ddff06802/5d0364048db4957100f33fea

【讨论】:

  • 这是删除我的文档。
  • 不,它不会删除任何文档。你试过了吗?
  • 我更新了我的答案以帮助您更好地理解您的问题。更改客户端的网址。
  • 是的,我也这样做了..它正在删除整个对象
  • console.log(req.params.userId)console.log(req.params.uId) 并检查输出是否正常
【解决方案2】:

尝试在此处硬编码您的 ID

Admin.findOneAndUpdate({ _id: req.params.userId },{ $pull: { 'admins.users': "5d0364048db4957100f33fea"}}) 

如果它工作,那么做

req.params.uId.toString()

【讨论】:

  • 即使在硬编码之后也没有工作。显示"Deleted" 消息,但它仍在数组中
  • 我将如何查询公司的{ _id: req.params.userId},它即将到来未定义。而且当我安慰result时,它是空的
  • 让我知道你的用户数组看起来如何,它只包含字符串,那么它会起作用,但如果 id 以这种方式存储 ObjectId("5ca5b052627cd94863a25b32") 那么你应该使用这个 var ObjectId =要求('mongodb').ObjectID; { _id: ObjectId (req.params.userId)}
  • 喜欢这个 db.getCollection('testing').update({_id:ObjectId("5d0765c44cacc6168afe7b42")}, {$pull:{"admins.users":"5ca5b0fa627cd94863a25b70"}} )
  • 那么你应该使用之前cmets中导入的ObjectId Admin.update({ _id: ObjectId(req.params.userId) },{ $pull: { 'admins.users': ObjectId( req.params.uId)}})
【解决方案3】:

尝试在数组的架构本身中将“_id”标记为 false。例如,在您的架构中,将“_id”标记为 false,如下所示:

admin: {
  type: Object,
  users: [{
    _id: false
  }]
}
.
.
//rest of the schema

【讨论】:

  • 为什么我要把它设为假?
  • 这将从嵌套数组中删除 _id,并返回您期望的结果。
  • 实际上我只在数组中推送_id。所以如果我把它弄错了,什么都不会被推动。从这里删除我想在一个操作中删除。谢谢我不知道这个。现在一切正常。
  • 如果这解决了您的问题,您介意接受并支持答案吗?
  • 我已经通过 dimitris tseggenes 的方式解决了。您的解决方案不会推送_id。我需要推送和删除。谢谢bdw。
猜你喜欢
  • 2019-01-13
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2021-12-11
  • 2019-01-25
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多