MongoDb - 如果set不存在,则以原子方式更新集合

时间:2014-01-22 09:46:15

标签: java mongodb

我的收藏中有以下文件:

{
   "_id":NumberLong(106379),
   "_class":"x.y.z.SomeObject",
   "name":"Some Name",
   "information":{
      "hotelId":NumberLong(106379),
      "names":[
         {
            "localeStr":"en_US",
            "name":"some Other Name"
         }
      ],
      "address":{
         "address1":"5405 Google Avenue",
         "city":"Mountain View",
         "cityIdInCitiesCodes":"123456",
         "stateId":"CA",
         "countryId":"US",
         "zipCode":"12345"
      },
      "descriptions":[
         {
            "localeStr":"en_US",
            "description": "Some Description"
         }
      ],
   },
   "providers":[

   ],
   "some other set":{
      "a":"bla bla bla",
      "b":"bla,bla bla",
   }
   "another Property":"fdfdfdfdfdf"
}

我需要遍历集合中的所有文档,如果"providers": []为空,我需要根据信息部分的值创建新集。

我远不是MongoDB专家,所以我有几个问题:

  • 我可以做原子操作吗?
  • 我可以使用MongoDB控制台执行此操作吗?据我所知,我可以使用$addToSet$each命令吗?
  • 如果没有,是否有任何基于Java的驱动程序可以提供此类功能?

2 个答案:

答案 0 :(得分:2)

  

我可以做原子操作吗?

每个文档都将以原子方式更新。在RDBMS意义上,MongoDB中没有“原子”,这意味着所有操作都会成功或失败,但您可以使用$isolated operator

阻止其他写入交错
  

我可以使用MongoDB控制台吗?

当然可以。要查找所有空提供程序数组,您可以发出如下命令:

db.zz.find(providers :{ $size : 0}})

要使用固定的字符串集更新数组长度为零的所有文档,您可以发出查询,例如

db.zz.update({providers : { $size : 0}}, {$addToSet : {providers : "zz"}})

如果您想根据文档的数据向文档添加部分内容,可以使用臭名昭着的$where query请注意该链接中出现的警告,或者 - 当您已经提到 - 查询空提供者数组,并使用cursor.forEach()

  

如果没有可以提供此类功能的基于Java的驱动程序?

当然,你有一个Java驱动程序,就像其他主要的编程语言一样。它实际上可以完成所描述的所有事情,基本上你可以从shell做的每件事。建议您从the Java Language Center开始。

还有一些框架可以帮助使用MongoDB并桥接对象文档世界。我不会在这里给出至少一点,因为我很偏颇,但我确信谷歌搜索可以快速搜索。

答案 1 :(得分:1)

db.so.find({ providers: { $size: 0} }).forEach(function(doc) {
    doc.providers.push( doc.information.hotelId );
    db.so.save(doc);
});

这会将相应文档的information.hotelId推送到空的providers数组中。将其替换为您希望插入providers数组的任何字段。