2016-04-25 77 views
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获得一些经验。

+0

不安:真意味着同样的事情。如果文档存在,只需更新它,否则用提供的值插入新文档。像所有其他编程语言一样,有定义的规则。给定的关键字或语句后可以添加什么。 MongoDB也是如此。检查文档以查看'update'中是否支持$ cond? – Saleem

+0

@saleem好的upsert做同样的事情。但是,我只是推$。我没有检查任何条件。它是一个更新或不是,它只是推动新的价值观的儿童对象。我错了吗?但是,我想要做的是编辑或推入一个查询。 –

+0

$ push是假设将项目推入数组而不管它是否存在。如果你想确保没有推送重复项目,请参阅$ addToSet。 – Saleem

回答

0

你的第一个解决方案是正确的,做你想做的事情。 upsert选项告诉mongo检查文档是否存在。然后,Mongo将插入文档,如果它不存在或更新现有的文档与新的价值它是一个文档与给定的ID存在。你不需要做任何事情。