$ inc operator&的问题java驱动程序

时间:2014-07-03 15:23:28

标签: java mongodb mongodb-java

我收到此错误: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时这都不会增加每个国家/地区的计数。

1 个答案:

答案 0 :(得分:1)

调试和记录真的是你的朋友亲爱的padawan。您应该始终转储您尝试执行的序列化。以下是您的fromDBObjecttoDBObject项目从转储中看起来的样子:

// 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}}

我确信当您查阅文档时,您会发现这些语句应该如何形成。