Bạn có thể tham chiếu mảng trong tài liệu phụ "level1" bằng cách sử dụng ký hiệu dấu chấm. Vì vậy, thay vì tạo các DBObject lồng nhau như bạn đã làm, bạn chỉ cần:
coll.update(entry, new BasicDBObject("$push", new BasicDBObject("level1.arr1", "val2")));
Tôi đã viết một bài kiểm tra để cho thấy điều này hoạt động:
@Test
public void shouldPushANewValueOntoANesstedArray() throws UnknownHostException {
final MongoClient mongoClient = new MongoClient();
final DBCollection coll = mongoClient.getDB("TheDatabase").getCollection("TheCollection");
coll.drop();
//Inserting the array into the database
final BasicDBList array = new BasicDBList();
array.add("val1");
final BasicDBObject entry = new BasicDBObject("level1", new BasicDBObject("arr1", array));
coll.insert(entry);
// results in:
// { "_id" : ObjectId("51a4cfdd3004a84dde78d79c"), "level1" : { "arr1" : [ "val1" ] } }
//do the update
coll.update(entry, new BasicDBObject("$push", new BasicDBObject("level1.arr1", "val2")));
// results in:
// { "_id" : ObjectId("51a4cfdd3004a84dde78d79c"), "level1" : { "arr1" : [ "val1", "val2" ] } }
}