2013-03-15 47 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 for chuck my keyboard at a wall part lol。 – 2017-01-09 23:43:25

回答

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

谢谢!正是我所期待的。我尝试了类似的东西,但我想我把它放在错误的地方。 – 2013-03-15 22:22:13

+0

我正在尝试这个例子,但它不允许我使用“更新”..而是要求我使用集合对象“updateone”。 – user2189668 2015-11-03 02:03:29

+1

不能使用'更新'!什么原因?! – 2016-08-23 14:11:51

11

如果你与外壳的查询格式更加舒适,你会发现它更容易使用JSON.parse来contstruct您DBObject$push

import com.mongodb.util.JSON; 

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

非常好的先生!它像jongo语法。真的希望我能接受这两个答案! – 2013-03-15 22:18:14

+0

非常感谢朋友 – nifCody 2015-12-02 07:45:20

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需要;-)

9

由于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)); 
+0

这是被低估的!新的驱动程序非常直观。 – KeksArmee 2017-11-29 12:49:50