我们假设我的结构为;
{
name: "",
surname: "",
id: 1,
children: [
{id: 2, name: "", age: ""},
{id: 3, name: "", age: ""}
]
}
我想根据情况添加新子项或更新现有子字段。
要将新子项添加到列表中,我编写了查询;
db.collection.update({id: 1}, {
$push: {
children: {
name: "alex",
age: 12,
id : shortid.generate()
}
}
}, {
upsert:true
},function(err, result) {
}
无论是插入还是更新,我都应该更新id为1的文档。所以我考虑将这两种情况合并为1个查询。
如果我想将子元素添加到children数组中,我应该使用$ push,否则如果是更新,我应该更新children对象的字段。所以通过使用$ cond,我写了一个像这样的查询;
db.collection.update({id: 1},
{
$cond : {
if: {id: {$exists: 21}} ,
then: {
$set: {
children: { name: "new name", age: "new age"}
}
},
else: {
$push: {
children: {
name: "alex",
age: 12,
id : 21
}
}
}
}, {
upsert:true
},function(err, result){}
我发现不可能有这样的查询,我收到了一个错误。这太不现实吗?我应该分开处理这两种情况吗?我认为这是一个好主意,因为我使用id:1更新相同的文档,无论是更新还是插入。唯一的变化是决定是否设置字段或创建并将它们推入子数组。你对这种情况有什么建议?是的,我承认,我正在努力获得mongodb和$ cond的一些经验。
答案 0 :(得分:0)
您的第一个解决方案是正确的,并按照您的意愿行事。 upsert选项告诉mongo检查文档是否存在。然后Mongo将插入文档(如果不存在)或使用新值更新现有文档,并且存在具有给定id的doc。你不需要做任何其他事情。