在mongo中删除子文档不起作用

时间:2018-08-10 03:18:01

标签: mongodb mongoose

我有一个Node / Express应用程序,在这里我试图使用findAndUpdate函数中的$ unset运算符删除嵌入的子文档。但是似乎什么也没发生。我知道过滤器是正确的。

这里是对象的示例,我要清除的嵌入式子文档是“共享”对象。

{
    "_id" : ObjectId("5b6cf8341666b48b847ab956"),
    "emails" : {
        "email_type" : "home",
        "email_address" : "tom@jones.com",
        "_id" : ObjectId("5b6cf834ee47267affac2c89")
    },
    "owner_id" : "5b6b2ee79076c830f01145c1",
    "__v" : 0,
    "first_name" : "Tom",
    "last_name" : "Jones",
    "initial" : "",
    "accepted" : true,
    "shared" : {
        "emails" : [
            {
                "email_type" : "personal",
                "email_address" : "randy@pits.com",
                "_id" : ObjectId("5b6b2f419076c830f01145c5")
            }
        ],
        "phones" : [
            {
                "phone_number" : "2065567876",
                "phone_type" : "home",
                "_id" : ObjectId("5b6b2f289076c830f01145c3")
            },
            {
                "phone_number" : "4256788765",
                "phone_type" : "mobile",
                "_id" : ObjectId("5b6b2f399076c830f01145c4")
            }
        ],
        "addresses" : [
            {
                "address" : "19889 West Palm",
                "city" : "Seattle",
                "state" : "State",
                "zip" : "98999",
                "address_type" : "personal",
                "_id" : ObjectId("5b6b2f5b9076c830f01145c6")
            }
        ],
        "businesses" : [ ],
        "_id" : ObjectId("5b6cf834ee47267affac2c88"),
        "invite_id" : "TomJones5b6b2ee79076c830f01145c1",
        "first_name" : "Randy",
        "last_name" : "pits"
    },
    "share_id" : "5b6cf834ee47267affac2c8b"
}

这是我的功能:

    const shareId = contact.share_id;

    Contact.findOneAndUpdate({_id:shareId},{
      $unset:{
        "shared":""
      }
    })

不确定我可能做错了什么...

更新:以为我会分享整个街区。我已经尝试了所有建议,但这根本行不通。

我没有得到我想要的东西:

router.route('/deletecontact/:contactId')

.delete(function(req, res) {
    Contact.findOne({ _id: req.params.contactId }, function(err, contact) {
        if (err)
            res.send(err);

        const shareId = contact.share_id;
        console.log('Contact ID is: ' + contact._id);
        console.log('Contact share ID is: ' + shareId);

        // Contact.findOne({_id:shareId}, (err, sender) => {
        //     console.log('The Sender: ', sender);
        // })

        Contact.update({_id:shareId}, {$unset:{shared:1}});


        res.json({ 'msg': 'Successfully removed contact' });

    });
});

谢谢!

1 个答案:

答案 0 :(得分:1)

请尝试使用output = b'Hello wsgi!' ,因为它只会更改一个文档。

此mongoDB查询有效(已测试):

update

现在,尽管它可以在Robo 3T和MongoDB控制台中运行,但Mongoose似乎希望您执行以下操作:

db.getCollection('<TEST-COL>').update({
  _id: ObjectId('<YOUR-OBJ-ID')
}, {
  $unset: {
    shared: 1
  }
})

Now as per their docs由于以下原因,这似乎是总体推荐的方式:

  

还请注意:尽管在以下情况下将值强制转换为适当的类型   使用更新时,不会应用以下内容:默认值,设置器,验证器,保存时触发的中间件