2012-08-29 29 views
0

在我UPSERT要求,我想这两个:使用改性剂或在UPSERT查询提供一个对象

  • 更新到位的对象,如果它的存在,又名

    db.somecollection.update({x: 1}, {$inc: {x: 1}}); 
    
  • 提供了新的对象,如果它不存在,又名

    db.somecollection.update({x: 1}, {whole: 0, new: 'yata', object: 42}); 
    

有没有办法做到这一点?

问题是,只有当你已经在第一个地方提供了一个对象,而不是一个修饰符时,upsert才起作用。

编辑:我会更具体。

我想更新的形式

{_id: 12, a: 123, b: 234, c: 345} 

的对象我的更新仅仅是一个的a一个,bc递增1。如果对象不在基地,然后我想创建形式

{_id: 13, a: 1, b: 0, c: 0} 

的对象,如果a是我试图增加该领域。现在

,如果我正确地阅读手册,我可以写

db.somecollection.update({_id: 12}, {$inc: {a: 1}}, true); 

这将很好地工作来更新我的a场,但如果对象不存在,不会创建领域bc

回答

1

Upserts可以使用修饰符;当需要创建新文档时,修饰符会应用到选择器/条件对象。请参阅here。但是,你需要设置upsert参数true在您的通话update

db.somecollection.update({x: 1}, {$inc: {x: 1}}, true); 

UPDATE

为了得到你要找的行为:

db.somecollection.update({_id: 12}, {$inc: {a: 1, b: 0, c: 0}}, true); 
+0

请看到我的编辑。对不起,没有问一个完整的问题在第一个地方;( – m09

+0

@Mog见更新的答案。 – JohnnyHK

+0

聪明,谢谢!似乎有限虽然。我不明白为什么而不是布尔作为第三个参数,对象不是如果有人需要正常更新,则为null。无论如何... – m09