2011-02-09 6 views
24

MongoDbのJavaドライバを使用してキーの値を変更できる方法はありますか?私は以下を試しました:

someCollection.update(DBObject query, DBObject update); 
someCollection.findAndModify(DBObject query, DBObject update); 

しかし両方の機能は、照会された文書を更新された文書で完全に置き換えます。 mongoシェルで$ setを使用する場合のように、特定のキーの値のうちの1つだけを更新する方法は何ですか(すべてのフィールドがコピーされ、フィールドの1つが更新された完全に新しいドキュメントを作成することは別として)。

答えて

19

は、私はJavaの専門家ではないけど、コードがあなたのニーズに合わせ、以下のようです:

BasicDBObject set = new BasicDBObject("$set", new BasicDBObject("age", 10)); 
set.append("$set", new BasicDBObject("name", "Some Name"); 
someCollection.update(someSearchQuery, set); 

はまたthis exampleを見てください。

+0

のための2番目のステートメントは何ですか? com.mongodb.DBCollectionクラスにappendという関数がないようです。しかし、2番目のステートメントがなければ正常に動作します。ありがとう –

+0

2番目のステートメントは、あなたが単一の更新で望むほど多くの「セット」を追加できることを示しています。それは私の間違いだった、someCollection.appendの代わりにset.appendする必要があります、私は私の答えを更新しました。 –

+3

こんにちは、これは正解ではなく、最後の値だけを設定します。私が下に投稿した答えを見てください。 –

1

正しい答えは私には分かりましたが、2番目のオブジェクトを追加するコードは私にとってはうまくいきませんでした。以下はやった:

BasicDBObject newValues = new BasicDBObject("age", 10); 
newValues.append("name", "Some Name"); 
BasicDBObject set = new BasicDBObject("$set", newValues); 
collection.update(someSearchQuery, set); 
28
BasicDBObject carrier = new BasicDBObject(); 
BasicDBObject query = new BasicDBObject(); 
query.put("YOUR_QUERY_STRING", YOUR_QUERY_VALUE); 

BasicDBObject set = new BasicDBObject("$set", carrier); 
carrier.put("a", 6); 
carrier.put("b", "wx1");   
myColl.updateMany(query, set); 

これは動作するはず、受け入れられている答えは真上ではありません。

+3

Andrew Orsichの答えは間違っています!これは動作します。 – astonia

+0

"query"がネストされている場合はどうなりますか?次にセットはどのように機能しますか? –

0

上記の解決策のどれも私のために働いていませんでした。私は、クエリがドキュメントの種類ではなくBasicDBObjectなければならないことを実現:私はしない限り、「yourMongoCollectionは」型である「はMongoCollection」とタイプの「OBJECTID」は、

0

まず「OBJECTID」

Document set = new Document("$set", new Document("firstName","newValue")); 

yourMongoCollection.updateOne(new Document("_id",objectId), set); 

私の値を再構成/再フォーマット/再入力するには、 findAndModifyではなく、 updateとするだけです。ここで

をお楽しみください... C &のpのために、完全に動作する例です。

Boolean updateValue(DB db, DBCollection collection, String id, String key, Object newValue) 
    { 
     DBCollection collection = db.getCollection(<collection name>); 

     // Identify your required document (id, key, etc...) 
     DBObject  query  = new BasicDBObject("_ID",<ID or key value>); 
     DBObject  update  = new BasicDBObject("$set", new BasicDBObject(key, newValue)); 

     //These flags will guarantee that you'lls get the updated result 
     DBObject  result  = collection.findAndModify(query, null, null, false, update,true, true); 

     //Just for precaution.... 
     if(result == null) 
      return false; 

     return result.get(key).equals(newValue); 
    } 
関連する問題