1

スクリプトに小さなバグがあります。

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

}

しかし、これは機能していません!値は変更されません。

ご協力いただきありがとうございます。

4

1 に答える 1

3

Java は非常に冗長な言語であり、最初に JS シェルを使用してクエリを記述し、期待どおりに動作することを確認してから、Java に変換するのが最も簡単な場合があります。

System.out.println(account.toString()) を Java コードに追加すると、Update ドキュメントは次のようになりますが、これは有効ではありません。

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

あなたの質問から、更新されたドキュメントをどのように表示したいかは完全には明確ではありませんが、「ステータス」と「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

上記の値を変更する 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);

私は、あなたがやりたいと思っている更新について少し推測したことを理解していますが、うまくいけば、上記が正しい方向に向けられるでしょう!

于 2012-04-19T18:17:00.093 に答える