Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java中的mongoDB更新数据_Java_Mongodb_Database_Nosql - Fatal编程技术网

使用Java中的mongoDB更新数据

使用Java中的mongoDB更新数据,java,mongodb,database,nosql,Java,Mongodb,Database,Nosql,我的脚本有一个小错误: BasicDBObject change = new BasicDBObject(); BasicDBObject account = new BasicDBObject().append("$set", new BasicDBObject().append("status", 0)); account.append("pos.X", getX());

我的脚本有一个小错误:

   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"
        }
通过这种方式,您将能够更轻松地使用点表示法访问每个变量,位置X、位置Y、位置Z,从您的帖子中可以看出这与您的意图类似。有关嵌入式文档的更多信息,请参见“点符号(触及对象)”文档:

下面是一条Update语句,它将修改上述值:

> 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);

我意识到我对你想要做的更新有点猜测,但希望上面的内容能让你找到正确的方向

谢谢你的帮助!!!这要归功于你的代码。我弄错了顺序。。。