有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

(MongoDB Java)$推入阵列

我正在使用Mongo2.2.3和java驱动程序。 我的困境是,我必须将一个字段和值推送到一个数组中,但我似乎不知道该怎么做。我的数据示例:

"_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时,我把自己搞糊涂了,把键盘扔到了墙上

到目前为止,我的java代码(不完整且错误):

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

共 (5) 个答案

  1. # 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));
    
  2. # 2 楼答案

    如果您更熟悉shell的查询格式,您可能会发现使用JSON.parse来为$push构建DBObject更容易:

    import com.mongodb.util.JSON;
    
    String json = "{$push:{scores:{type:'quiz', score:99}}}";
    DBObject push = (DBObject) JSON.parse(json);
    
  3. # 3 楼答案

    因为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));
    
  4. # 4 楼答案

    使用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);
    

    不需要任何对象;-)

  5. # 5 楼答案

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