2012-02-13 13 views
3

免責事項:私はMongoとデータベース全般の悩みです。専門用語や概念については私に教えてください。MongoDBドキュメントのフィールドのアトミック更新を実行するにはどうすればよいですか?

この例では、ドキュメント内にネストされたオブジェクト内にマウス座標を一緒に格納したいと考えています。それはatomic updating, via modifier operationsように思える

{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "mouseLoc" : { "x" : 10, "y" : 20 } } 

、進むべき道は、私はここでしか値を格納していて(他のソフトウェアでは、他の場所でそれらを取得する)、である:その文書には、次のようになります。しかし、私はクエリの部分を把握することはできません。 xとyの値を設定するには、この文書にどのようにアクセスすればよいですか?

私は、Javaを使用していますので、私は現在、しようとしている:

BasicDBObject mouseLoc = new BasicDBObject(); 
mouseLoc.put("x", mouseX); 
mouseLoc.put("y", mouseY); 
myCollection.update(queryObj, new BasicDBObject("$set", mouseLoc), true, false); 

をしかし、私はqueryObjがmouseLocキーで文書を取得するように指定する方法がわかりません。また、このような情報を保存するスマートな方法がある場合は、学校に行ってください。

もっと簡単なのであれば、Mongo shell/JSのヒントに従うことができます。


UPDATE:
私はそれを「名前」のような静的フィールドを与える場合、私は、この文書を照会することができます。だから、このドキュメント更新する:

{ "_id" : ObjectId("4f39805d35919a2a7c7aba3e"), "name" : "mouseLoc", "mouseLoc" : { "x" : 10, "y" : 20 } } 

を、私はこのコードを使用することができます:

BasicDBObject mouseLoc = new BasicDBObject(); 
mouseLoc.put("x", mouseX); 
mouseLoc.put("y", mouseY); 

BasicDBObject queryObj = new BasicDBObject("name", "mouseLoc"); 
BasicDBObject updateObj = new BasicDBObject("$set", new BasicDBObject("mouseLoc", mouseLoc)); 

myCollection.update(queryObj, updateObj, true, false); 

しかし、それだけでドキュメントを取得できるようにするという「名前」フィールドを指定する必要が冗長と思われます「mouseLoc」キー。多分私はデータベース/モンゴーデザインを誤解しているのでしょうか?

答えて

0

クエリ部分では、文書を見つける方法を指定します。たとえば、_idまたは別の一意のフィールドです。あなたの例では

、それは次のようになります。

ObjectId objectId = new ObjectId("4f39805d35919a2a7c7aba3e"); 
BasicDBObject queryObj = new BasicDBObject("_id", objectId); 

は(私は、Javaを知らないので、たぶんについてObjectIdを逃す何かが、あります)

UPDATE

の場合特定のmouseLocを検索している場合、queryObjは非常にmouseLocオブジェクトになります。 (JSONでは{ 'x': mouseX, 'y': mouseY }

+0

ObjectIdは実際にはシェルfind()からそのままコピーされますが、Javaのものではありません。そうですね、私はクエリのパラメータを使用しています。しかし、私はちょうどその値に関係なく、いくつかの "mouseLoc"キーでドキュメントを取得したいと思います。私はデータベース設計を誤解していますか? 「_id」のような固有の名前と値のペア、または「名前」フィールドを使用する上記の私の更新が必要ですか? – ericsoco

+0

良い、今私はあなたのポイントを得た。私は私の答えを更新します。 –

+0

@ericsoco 'mouseLoc'からドキュメントを取得するには、' queryObj'にします。しかし、新しいXとYに更新する場合は、 'mouseLoc'という' mouseLocBefore'( 'queryObj')と' mouseLocAfter'(更新オブジェクト)という2つの 'mouseLoc'があり、同じアップデートで両方を使うことができますコマンド: 'myCollection.update(mouseLocBefore、mouseLocAfter、true、false);'。 –

0

.指定子はどうしますか?

myCollection.updateOne(Document.parse("{ \"_id\" : ObjectId(\"4f39805d35919a2a7c7aba3e\")}"), 
    Document.parse("{$set:{ \"mouseLoc.x\" : "+mouseX+", \"mouseLoc.y\" : "+mouseY+" }") 
) 
関連する問題