当涉及不同的数据库操作且一个操作依赖于其他操作时,有哪些不同的方法和最佳方法来确保执行顺序。 像这样的代码中的东西:
String countryName = "name";
Country countryObj = new Country();
countryObj.setName(countryName);
countryObj.setStates(new ArrayList<State>());
// update database
PersistenceManager manager = new PersistenceManager();
List<Country> countries = manager.getAllCountries();
if (countries != null && !countries.isEmpty()) {
for (Country country2 : countries) {
if (country2.getName().equalsIgnoreCase(countryName)) {
return;
}
}
}
manager.saveCountry(countryObj, country);
这里manager.getAllCountries()从数据库中检索所有国家,manager.saveCountry依赖于以前的操作
答案 0 :(得分:0)
我认为您需要从查看数据建模的角度开始使用atomic operations。
您所描述的是插入数据(如果不存在)。您可以使用upsert执行此操作,并根据您的逻辑查看该国家/地区是否存在您不想更改任何内容(因为您刚刚退出方法)。因此,您只需使用$setOnInsert运算符即可,只有<{>}} 才能保存countryObj
的值,如果它还不存在的话。
最后一个障碍是名称匹配 - 因为您正在测试名称的小写版本的等效性 - 您可以在查询中使用regular expression,但这样可以对集合中的文档进行全面扫描 - 所以另一个选择是存储小写名称以匹配。
使用shell语法查询和插入的示例如下:
db.collection.update(
{lname: countryName.toLowerCase()},
{ $setOnInsert: { name: countryName, states: [{name: "Victoria"}] } },
{ upsert: true }
)
当然,如果您想在country
存在的情况下更新任何信息,即使该国家/地区存在,您也可以使用$set
运算符进行更新。