【问题标题】:(MongoDB Java) $push into array(MongoDB Java) $push 入数组
【发布时间】:2013-03-04 09:52:52
【问题描述】:

我正在使用 mongo 2.2.3 和 java 驱动程序。 我的困境,我必须将一个字段和值推入一个数组,但我似乎无法弄清楚如何做到这一点。我的数据样本:

"_id" : 1,
"scores" : [
    {
        "type" : "homework",
        "score" : 78.97979
    },
    {
        "type" : "homework",
        "score" : 6.99
    },
    {
        "type" : "quiz",
        "score" : 99
    }
]

我可以在 shell 中 $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()));

【问题讨论】:

    标签: java mongodb mongo-java nosql-aggregation jongo


    【解决方案1】:
    DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99));
    DBObject updateQuery = new BasicDBObject("$push", listItem);
    myCol.update(findQuery, updateQuery);
    

    【讨论】:

    • 谢谢!正是我想要的。我尝试了类似的东西,但我认为我把 .append 放在了错误的地方。
    • 我正在尝试这个例子,但它不允许我使用“update”..而是要求我使用集合对象的“updateone”..
    • 无法使用“更新”!什么原因?!
    【解决方案2】:

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

    【讨论】:

    • 这被低估了!新驱动程序更加直观。
    • 请注意,与$push 完全等效的是com.mongodb.client.model.Updates.push,它可以添加重复项。另一方面,Updates.addToSet 用于模拟一个集合,如果元素已经存在,则不插入。
    【解决方案3】:

    如果您更习惯于 shell 的查询格式,您可能会发现使用JSON.parseDBObject 构造成$push 会更容易:

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

    【讨论】:

    • 非常好,先生!它就像 jongo 语法。真希望我能接受这两个答案!
    【解决方案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);
    

    不需要花哨的 DBObject ;-)

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-20
        • 2020-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多