我正在使用mongo 2.2.3和java驱动程序。 我的困境,我必须把一个字段和值推入一个数组,但我似乎无法弄清楚如何做到这一点。我的数据样本:
"_id" : 1,
"scores" : [
{
"type" : "homework",
"score" : 78.97979
},
{
"type" : "homework",
"score" : 6.99
},
{
"type" : "quiz",
"score" : 99
}
]
我可以推进shell:
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()));
答案 0 :(得分:33)
DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99));
DBObject updateQuery = new BasicDBObject("$push", listItem);
myCol.update(findQuery, updateQuery);
答案 1 :(得分:16)
由于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));
答案 2 :(得分:12)
如果您对shell的查询格式更为满意,您可能会发现使用JSON.parse
为DBObject
构建$push
更容易:
import com.mongodb.util.JSON;
String json = "{$push:{scores:{type:'quiz', score:99}}}";
DBObject push = (DBObject) JSON.parse(json);
答案 3 :(得分:6)
使用Jongo,您可以as in the shell:
db.collection.update({_id:1},{$push:{scores:{type:"quiz", score:99}}})
成为Java:
collection.update("{_id:1}").with("{$push:{scores:{type:#, score:#}}}", "quiz", 99);
不需要花哨的DBObject; - )
答案 4 :(得分:1)
MongoDB Java驱动程序可以简化此过程。使用$ each代替$ push。
$each mongodb reference document
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));