私はmongo 2.2.3とJavaドライバーを使用しています。私のジレンマは、フィールドと値を配列に$ Pushする必要がありますが、これを行う方法を理解できないようです。私のデータのサンプル:
"_id" : 1,
"scores" : [
{
"type" : "homework",
"score" : 78.97979
},
{
"type" : "homework",
"score" : 6.99
},
{
"type" : "quiz",
"score" : 99
}
]
シェルで$ Pushできます:
db.collection.update({_id:1},{$Push:{scores:{type:"quiz", score:99}}})
しかし、これをJavaに変換するときです。自分を混乱させ、キーボードを壁に押し付けます。
これまでのmy Javaコード(不完全で間違っている):
DBObject find = new BasicDBObject("_id", 1);
DBObject Push = new BasicDBObject("$Push", new BasicDBObject(
"scores", new BasicDBObject()));
DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99));
DBObject updateQuery = new BasicDBObject("$Push", listItem);
myCol.update(findQuery, updateQuery);
mongodb-driver 3.1.
ビルダークラスがありますcom.mongodb.client.model.Updates
各更新ケースに適切なメソッドを使用します。この場合、これは次のようになります。
Document score = new Document().append("type", "quiz")
.append("score",99);
collection.updateOne(eq("_id", "1"),Updates.addToSet("scores", score));
シェルのクエリ形式に慣れている場合は、JSON.parse
を使用して$Push
のDBObject
を作成する方が簡単な場合があります。
import com.mongodb.util.JSON;
String json = "{$Push:{scores:{type:'quiz', score:99}}}";
DBObject Push = (DBObject) JSON.parse(json);
Jongoを使用すると、 シェルの場合と同様 を実行できます。
db.collection.update({_id:1},{$Push:{scores:{type:"quiz", score:99}}})
Javaになります:
collection.update("{_id:1}").with("{$Push:{scores:{type:#, score:#}}}", "quiz", 99);
派手なDBObjectは必要ありません;-)
MongoDB Javaドライバーはこれを簡素化できます。$ Pushの代わりに$ eachを使用します。
Javaサンプル-
BasicDBObject addressSpec = new BasicDBObject();
addressSpec.put("id", new ObjectId().toString());
addressSpec.put("name", "one");
BasicDBObject addressSpec2 = new BasicDBObject();
addressSpec2.put("id", new ObjectId().toString());
addressSpec2.put("name", "two");
List<BasicDBObject> list = new ArrayList<>();
list.add(addressSpec); list.add(addressSpec2);
UpdateResult updateOne = individualCollection.updateOne(Filters.eq("_id", "5b7c6b612612242a6d34ebb6"),
Updates.pushEach("subCategories", list));