如何正确保存到mongodb?
How to save properly to mongodb?
所以这是我第一次使用 MongoDB,我在保存到文档时遇到了问题
保存方式
public void addStamp(UUID playerUUID, UUID issuedByUUID, String playerCountry, String enteringCountry, String enteringCity, boolean isEntry, Date date) {
Document document = getPassport(playerUUID, playerCountry);
DBObject stamp = new BasicDBObject("stampFor", enteringCountry)
.append("cityEntered", enteringCity)
.append("issuedBy", issuedByUUID)
.append("isEntry", isEntry)
.append("date", date);
List<DBObject> stamps = (List<DBObject>) document.get("stamps");
stamps.add(stamp);
mongoCollection.updateOne(document, new Document("$set", new Document("stamps", stamps)));
}
获取护照的方法(getPassport)
public Document getPassport(UUID uuid, String country) {
List<Document> list;
if (get(uuid, "passports") != null) list = get(uuid, "passports");
else return null;
for (Document document : list) {
if (document.getString("country").equalsIgnoreCase(country))
return document;
}
return null;
}
获取方法
public <T> T get(UUID uuid, String key) {
Document document = mongoCollection.find(new Document("UUID", uuid)).first();
if (document == null) return null;
if (document.get(key) == null) return null;
return (T) document.get(key);
}
文档的结构,
{
"_id": {
"$oid": "5e71c1ea12ee5455287a968f"
},
"UUID": {
"$uuid": "12642edb-f181-4fbf-bfff-642097f1cc69"
},
"passports": [
{
"country": "usa",
"issuedBy": {
"$uuid": "12642edb-f181-4fbf-bfff-642097f1cc69"
},
"city": "nyc",
"date": {
"$date": "2020-03-18T06:38:34.734Z"
},
"stamps": []
}
]
}
我想做的是编辑文档的邮票部分,但使用我的代码,它执行时没有问题,但它没有对文档进行任何更改,我不确定是什么问题是。
您的 get
函数只 return 没有其他识别数据的护照数组,getPassport
函数然后 returns 只有来自匹配的护照对象国家。
这意味着你打电话的时候
mongoCollection.updateOne(document, ... )
document
的内容类似于:
{
"country": "usa",
"issuedBy": {
"$uuid": "12642edb-f181-4fbf-bfff-642097f1cc69"
},
"city": "nyc",
"date": {
"$date": "2020-03-18T06:38:34.734Z"
},
"stamps": []
}
这只会匹配 mongoCollection 中具有顶级字段 country
、issuedBy
、city
、date
和 stamps
的文档与显示的确切值。由于这不是该集合中文档的样子,因此它不匹配任何内容,这不是错误,但也意味着没有更新任何内容。
另请注意,updateOne
适用于文档,而不是子数组的元素,因此替换 stamps
可能不会如您所愿。
您可以使用数组过滤器或管道形式的更新,通过 $map 或 $filter 来仅编辑匹配的元素。
所以这是我第一次使用 MongoDB,我在保存到文档时遇到了问题
保存方式
public void addStamp(UUID playerUUID, UUID issuedByUUID, String playerCountry, String enteringCountry, String enteringCity, boolean isEntry, Date date) {
Document document = getPassport(playerUUID, playerCountry);
DBObject stamp = new BasicDBObject("stampFor", enteringCountry)
.append("cityEntered", enteringCity)
.append("issuedBy", issuedByUUID)
.append("isEntry", isEntry)
.append("date", date);
List<DBObject> stamps = (List<DBObject>) document.get("stamps");
stamps.add(stamp);
mongoCollection.updateOne(document, new Document("$set", new Document("stamps", stamps)));
}
获取护照的方法(getPassport)
public Document getPassport(UUID uuid, String country) {
List<Document> list;
if (get(uuid, "passports") != null) list = get(uuid, "passports");
else return null;
for (Document document : list) {
if (document.getString("country").equalsIgnoreCase(country))
return document;
}
return null;
}
获取方法
public <T> T get(UUID uuid, String key) {
Document document = mongoCollection.find(new Document("UUID", uuid)).first();
if (document == null) return null;
if (document.get(key) == null) return null;
return (T) document.get(key);
}
文档的结构,
{
"_id": {
"$oid": "5e71c1ea12ee5455287a968f"
},
"UUID": {
"$uuid": "12642edb-f181-4fbf-bfff-642097f1cc69"
},
"passports": [
{
"country": "usa",
"issuedBy": {
"$uuid": "12642edb-f181-4fbf-bfff-642097f1cc69"
},
"city": "nyc",
"date": {
"$date": "2020-03-18T06:38:34.734Z"
},
"stamps": []
}
]
}
我想做的是编辑文档的邮票部分,但使用我的代码,它执行时没有问题,但它没有对文档进行任何更改,我不确定是什么问题是。
您的 get
函数只 return 没有其他识别数据的护照数组,getPassport
函数然后 returns 只有来自匹配的护照对象国家。
这意味着你打电话的时候
mongoCollection.updateOne(document, ... )
document
的内容类似于:
{
"country": "usa",
"issuedBy": {
"$uuid": "12642edb-f181-4fbf-bfff-642097f1cc69"
},
"city": "nyc",
"date": {
"$date": "2020-03-18T06:38:34.734Z"
},
"stamps": []
}
这只会匹配 mongoCollection 中具有顶级字段 country
、issuedBy
、city
、date
和 stamps
的文档与显示的确切值。由于这不是该集合中文档的样子,因此它不匹配任何内容,这不是错误,但也意味着没有更新任何内容。
另请注意,updateOne
适用于文档,而不是子数组的元素,因此替换 stamps
可能不会如您所愿。
您可以使用数组过滤器或管道形式的更新,通过 $map 或 $filter 来仅编辑匹配的元素。