在传递Iterable对象时,Datastore.save()的预期行为是什么?

时间:2018-01-09 00:55:25

标签: java mongodb morphia

我正在调试涉及MongoDB和两个程序的奇怪情况。

有问题的MongoDB安装最初是空的,是玩具部署。

有两个程序。一个使用Morphia。另一个没有。

非Morphia-using程序将记录插入Service数据库中的foo-bar集合中,如下所示:

mongo << EOF
db.getSiblingDB("foo-bar").getCollection("Service").replaceOne( {
  "service_name" : "argle-bargle"
}, {
  "_id" : "argle-bargle",
  "className" : "com.foo.Service",
  "service_name" : "argle-bargle",
}, {
  "upsert" : true
} )
EOF

写入被确认:

MongoDB shell version v3.4.6
connecting to: mongodb://aura-mongodb:27017/
MongoDB server version: 3.4.6
{
    "acknowledged" : true,
    "matchedCount" : 0,
    "modifiedCount" : 0,
    "upsertedId" : "argle-bargle"
}
bye

Morphia使用程序执行此操作:

final MongoClient client = // ...
final Morphia morphia = new Morphia();
morphia.mapPackage("com.foo");
final Datastore dataStore = morphia.createDatastore(client, "foo-bar");
assert dataStore != null;
dataStore.ensureIndexes();

......接着是:

final Collection<com.foo.Service> services = // ...collection of size 2...
this.dataStore.save(services);

现在数据库中应该有三个项目。没有。

mongo联系并获取Service数据库中的foo-bar集合,并发出find()表示有两个(Morphia使用程序的结果)操作)。

我希望如果我在该集合中有20,000条记录,save(collectionOf2Items)不会删除19,998条记录!

那么:当save递给Iterable时,import CoreTelephony var cellularDataRestrictedState = CTCellularDataRestrictedState.restrictedStateUnknown let cellState = CTCellularData.init() cellState.cellularDataRestrictionDidUpdateNotifier = { (dataRestrictedState) in if cellularDataRestrictedState != .restrictedStateUnknown { // State has changed - log to console print("cellularDataRestrictedState: " + "\(dataRestrictedState == .restrictedStateUnknown ? "unknown" : dataRestrictedState == .restricted ? "restricted" : "not restricted")") } cellularDataRestrictedState = dataRestrictedState } 是否具有破坏性?关于如何调试这个令人困惑的问题的任何其他建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

很难在没有任何代码的情况下判断,但如果项目的ID与调用save()匹配,则只会更新现有项目。

来自Morhpia Quick Tour

  

更新MongoDB中的数据就像更新Java对象,然后再次使用它们调用datastore.save()一样简单。

编辑: 对于调试,尝试手动将ID字段设置为您尚未使用的ID可能是值得的。