0
假设我有一个结构为;将2个查询合并为1个查询
{
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个查询。
如果我想添加孩子到儿童数组,我应该使用$推,否则,如果它是一个更新,我应该更新儿童对象的字段。所以通过使用$ 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获得一些经验。
不安:真意味着同样的事情。如果文档存在,只需更新它,否则用提供的值插入新文档。像所有其他编程语言一样,有定义的规则。给定的关键字或语句后可以添加什么。 MongoDB也是如此。检查文档以查看'update'中是否支持$ cond? – Saleem
@saleem好的upsert做同样的事情。但是,我只是推$。我没有检查任何条件。它是一个更新或不是,它只是推动新的价值观的儿童对象。我错了吗?但是,我想要做的是编辑或推入一个查询。 –
$ push是假设将项目推入数组而不管它是否存在。如果你想确保没有推送重复项目,请参阅$ addToSet。 – Saleem