【问题标题】:Update data with mongoDB in Java在 Java 中使用 mongoDB 更新数据
【发布时间】:2012-04-19 16:55:19
【问题描述】:

我的脚本有个小错误:

   BasicDBObject change = new BasicDBObject();   
   BasicDBObject account =
     new BasicDBObject().append("$set", new BasicDBObject().append("status", 0));
   account.append("pos.X", getX());                                        
   account.append("pos.Y", getY());                                      
   account.append("pos.Z", getZ());                                          
   change.append("pseudo", gPlayer);
   coll.update(change, account);

而mongoDB的结构是:

{
      pseudo: "pseudo"
      email: "email"
      password: "password"
      status: "1"
      pos: [
        {X: "90.45}
        {Y: "90.45}
        {Z: "90.45}
      ]

}

但这不起作用!没有值被修改。

感谢您的帮助。

【问题讨论】:

    标签: java mongodb database nosql


    【解决方案1】:

    Java 是一种非常冗长的语言,有时最简单的方法是首先使用 JS shell 编写查询,确保它按要求执行,然后将其翻译成 Java。

    通过将 System.out.println(account.toString()) 添加到您的 Java 代码中,我可以看到您的更新文档如下所示,这是无效的:

    { "$set" : { "status" : 0} , "pos.X" : "90.45" , "pos.Y" : "90.45" , "pos.Z" : "90.45"}
    

    从您的问题来看,您希望更新后的文档看起来像什么并不完全清楚,但我猜您想修改“status”和“pos.0.X”、“pos”的值.1.Y”和“pos.2.Z”。因为 X、Y 和 Z 都作为单独的嵌入文档存储在数组中,所以必须通过它们的位置来引用它们才能同时更新。如果可能,您可能会发现最好重新排列文档结构,使 X、Y 和 Z 都存储在同一个文档中,如下所示:

    "pos" : {
                "X" : "0", 
                "Y" : "0",
                "Z" : "0"
            }
    

    这样,您将能够使用点符号 pos.X、pos.Y、pos.Z 更轻松地访问每个变量,从您的帖子来看,这与您的意图相同。更多关于嵌入文档的信息可以在“Dot Notation (Reaching into Objects)”文档中找到: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

    这是一个更新语句,它将修改上述值:

    > db.pseudo.find({ "pseudo" : "gPlayer"}).pretty()
    {
        "_id" : ObjectId("4f904ebb5bebd4375b759c90"),
        "email" : "email",
        "password" : "password",
        "pos" : [
            {
                "X" : "90.45"
            },
            {
                "Y" : "90.45"
            },
            {
                "Z" : "90.45"
            }
        ],
        "pseudo" : "gPlayer",
        "status" : "1"
    }
    > db.pseudo.update({"pseudo" : "gPlayer"}, { "$set" : { "status" : 0 , "pos.0.X" : "0" , "pos.1.Y" : "0" , "pos.2.Z" : "0"}})
    > db.pseudo.find({ "pseudo" : "gPlayer"}).pretty()
    {
        "_id" : ObjectId("4f904ebb5bebd4375b759c90"),
        "email" : "email",
        "password" : "password",
        "pos" : [
            {
                "X" : "0"
            },
            {
                "Y" : "0"
            },
            {
                "Z" : "0"
            }
        ],
        "pseudo" : "gPlayer",
        "status" : 0
    }
    > 
    

    翻译成Java是这样的:

    BasicDBObject change = new BasicDBObject("pseudo", "gPlayer");   
    BasicDBObject setDoc = new BasicDBObject();                 
    setDoc.append("status", "0"); 
    setDoc.append("pos.0.X", "0");                                        
    setDoc.append("pos.1.Y", "0");                                      
    setDoc.append("pos.2.Z", "0");                                          
    BasicDBObject account = new BasicDBObject("$set", setDoc);
    coll.update(change, account);
    

    我意识到我对您想要进行的更新的确切猜测有所猜测,但希望以上内容能让您找到正确的方向!

    【讨论】:

    • 感谢您的帮助!!!这要归功于您的代码。我的顺序错了……
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多