我正在开发一个使用mongodb的快递应用程序。我编写了代码,使用保存方法插入和更新数据,工作正常。
工作代码
dbconnect.collection('profiles').save(data, function (err, result) {
if (err)
return res.send({ success: false, message: "Error saving into database" });
result = JSON.parse(JSON.stringify(result));
if (_.isEmpty(result) || !result.ok)
return res.send({ success: false, message: "Unidentified error." })
return res.send({ success: true });
});
如果我更新数据,整个文档都会更新。是的,正如它所说。但是我想省略一个字段。
我的字段是
username, password, email, postal_address
如果我没有_id传递,它会创建一个新的_id并插入文档。
如果用户尝试更新postal_address,则会删除密码,因为数据不包含密码字段。它就像重写整个文档一样。
由于代码已编写,我不想将代码分为插入和更新两部分,我正在寻找一种方法,我可以使用保存本身更新部分文档。
希望我明白我的问题。
答案 0 :(得分:2)
如果我理解你的问题,你不想使用多个命令进行插入和更新。
您可以使用更新命令,并将upsert
选项设置为true。
您可以使用某个查询选择器查找文档,并在更新对象中使用"$set"
和"$setOnInsert"
运算符。
"$setOnInsert"
可用于在某些自定义逻辑上添加字段,只有在文档被插入并且未更新时才会应用这些字段。
db.collection.update(query, update, {upsert: true})
`db.products.update(
{ name: 'Apple' },
{
$set: { item: "apple" },
$setOnInsert: { defaultQty: 100 }
},
{ upsert: true }
)`
请参阅此处了解更多信息:MongoDB $setOnInsert
您必须仔细选择查询选择器,因为当您不在查询选择器中提供任何字段时,它将匹配任何文档并将更新该特定文档。因此,最好使用一些可靠的查询选择器,而不是根据您的要求在查询选择器中使用_id
,并让upsert自动创建_id
(或使用" $ setOnInsert&设置_id
#34)
希望这有帮助。