我的收藏中有以下文件:
{
"_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专家,所以我有几个问题:
$addToSet
和$each
命令吗?答案 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
数组的任何字段。