java - 在 Java 中使用 mongoDB 更新数据

标签 java mongodb database nosql

我的脚本有一个小错误:

   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 是一种非常冗长的语言,有时最简单的方法是先使用 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 更轻松地访问每个变量,从您的帖子来看,这与您的意图相符。有关嵌入式文档的更多信息,请参见“点符号(进入对象)”文档: 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);

我意识到我对您想要进行的更新有一些猜测,但希望以上内容能为您指明正确的方向!

关于java - 在 Java 中使用 mongoDB 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10233007/

相关文章:

java - 仅对一个数组执行计算时,如何防止两个数组相等?

mongodb - 如何增加 MongoDB 中索引引用的数组元素?

java - 主应用程序的软件集成和共享数据库

mysql - 如何查找一个字段的内容在另一个字段的任何行中的 MySQL 记录

java - 字符串的单词反转

java - XML 模式继承与 OOP 继承的意义相同吗?

java - 具有接口(interface)的枚举类成员无法在内部找到方法

node.js - Nodejs Mongo插入子文档 - 动态字段名

javascript - 为什么这些日期从 MongoDb 获取后结果为 'Invalid Dates'?

mysql - MySQL 数据库的最大表大小