将2个查询组合成1个查询

时间:2016-04-25 11:28:18

标签: node.js mongodb insert

我们假设我的结构为;

{
  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的一些经验。

1 个答案:

答案 0 :(得分:0)

您的第一个解决方案是正确的,并按照您的意愿行事。 upsert选项告诉mongo检查文档是否存在。然后Mongo将插入文档(如果不存在)或使用新值更新现有文档,并且存在具有给定id的doc。你不需要做任何其他事情。