我收到此错误:Document field names can't start with '$' (Bad Key: '$inc')
使用此代码:
private static void countryInc(String user_id, String country, BasicDBObject doc, DBCollection dBcollection, Integer count ) throws IOException {
DBObject fromDBobject = new BasicDBObject();
DBObject countryDBobject = new BasicDBObject();
countryDBobject.put(country, count);
fromDBobject.put("user_id", user_id);
fromDBobject.put("countries", countryDBobject);
DBObject toDBobject = new BasicDBObject();
DBObject ccDBObject = new BasicDBObject(country, 1);
DBObject incdbobject = new BasicDBObject("$inc", ccDBObject);
toDBobject.put("user_id", user_id);
toDBobject.put("countries", incdbobject);
dBcollection.update(fromDBobject, toDBobject);
}
这是我的数据库的样本:
{
"_id" : {
"$oid" : "53b56ccb1ac175a446cf244f"
},
"user_id" : "7778",
"countries": { "JA" : 1}
}
{
"_id" : {
"$oid" : "53b56ccb1ac175a446cf2450"
},
"user_id" : "4657",
"countries" : { "TU" : 1}
}
{
"_id" : {
"$oid" : "53b56ccb1ac175a446cf2451"
},
"user_id" : "5918",
"countries" : { "BR" : 1}
}
我不知道为什么每次看到user_id时这都不会增加每个国家/地区的计数。
答案 0 :(得分:1)
调试和记录真的是你的朋友亲爱的padawan。您应该始终转储您尝试执行的序列化。以下是您的fromDBObject
和toDBObject
项目从转储中看起来的样子:
// from
{ "user_id" : 7778 , "countries" : { "JA" : 1} }
// to
{ "user_id" : 7778 , "countries" : { "$inc" : { "JA" : 1} } }
快速浏览一般文档应该会向您显示与“update”文档部分的有效更新语句没有远程接近。
您需要$inc
一侧位于您要更新的字段的另一侧,而user_id
部分确实不需要。除此之外,您需要使用“点符号”,因为这是形成查询的更简化和更准确的方法。
对我来说,语句的基本“查询”和“更新”部分是这样形成的:
DBObject query = new BasicDBObject(
"user_id", 7778
).append(
"countries.JA", 1
);
DBObject update = new BasicDBObject(
"$inc", new BasicDBObject("countries.JA", 1)
);
System.out.println("//query:\n" + query);
System.out.println("//update:\n" + update);
非常简单的序列化:
//query:
{ "user_id" : 7778 , "countries.JA" : 1}
//update:
{ "$inc" : { "countries.JA" : 1}}
我确信当您查阅文档时,您会发现这些语句应该如何形成。