我有一个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' });
});
});
谢谢!
答案 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由于以下原因,这似乎是总体推荐的方式:
还请注意:尽管在以下情况下将值强制转换为适当的类型 使用更新时,不会应用以下内容:默认值,设置器,验证器,保存时触发的中间件