2013-03-15 21 views
29

私はmongo 2.2.3とjavaドライバを使用しています。 私のジレンマは、$フィールドと値を配列にプッシュする必要がありますが、これを行う方法を理解できないようです。私のデータのサンプル:

"_id" : 1, 
"scores" : [ 
    { 
     "type" : "homework", 
     "score" : 78.97979 
    }, 
    { 
     "type" : "homework", 
     "score" : 6.99 
    }, 
    { 
     "type" : "quiz", 
     "score" : 99 
    } 
] 

私はできシェルで$プッシュ:

db.collection.update({_id:1},{$push:{scores:{type:"quiz", score:99}}}) 

が、私は、私は私の自己を混同するJavaにこれを翻訳し、壁に私のキーボードをチャックするとき、それはです。

私のJavaコード(不完全と間違っている)、これまで:

DBObject find = new BasicDBObject("_id", 1); 
DBObject push = new BasicDBObject("$push", new BasicDBObject(
         "scores", new BasicDBObject())); 
+1

upvotedチャック私のキーボードの壁の部分でlol。 –

答えて

31
DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99)); 
DBObject updateQuery = new BasicDBObject("$push", listItem); 
myCol.update(findQuery, updateQuery); 
+0

ありがとう!正確に私が探していたもの。私は同様のものを試しましたが、私は間違った場所に.appendを置くと思います。 –

+0

私はこの例を試していますが、 "update"を使用することはできません。代わりにコレクションオブジェクトで "updateone"を求めています。 – user2189668

+1

'update'を使用することはできません!どういう理由ですか?! –

11

あなたはシェルのクエリ形式でより多くのcomforableなら、あなたはそれがcontstructするJSON.parseを使用する方が簡単です見つけることがあります$pushためDBObject

import com.mongodb.util.JSON; 

String json = "{$push:{scores:{type:'quiz', score:99}}}"; 
DBObject push = (DBObject) JSON.parse(json); 
+0

非常に良いサー!そのようなjongo構文です。本当に私は両方の答えを受け入れることができたらいいと思う! –

+0

おかげでおしっこ – nifCody

6

Jongoを使用して、as in the shellを行うことができます。

db.collection.update({_id:1},{$push:{scores:{type:"quiz", score:99}}}) 

Javaで次のようになります。各更新の場合に適した方法で、ビルダークラスcom.mongodb.client.model.Updatesがあるmongodb-driver 3.1.ので

collection.update("{_id:1}").with("{$push:{scores:{type:#, score:#}}}", "quiz", 99); 

ない空想DBObjectをは;-)

9

を必要としていました。この場合、これは次のようになります:

Document score = new Document().append("type", "quiz") 
           .append("score",99); 

collection.updateOne(eq("_id", "1"),Updates.addToSet("scores", score)); 
+0

これは過小評価されています!新しいドライバははるかに直感的です。 – KeksArmee