【问题标题】:Multiple update in mongodb using java使用java在mongodb中进行多次更新
【发布时间】:2014-11-07 10:33:09
【问题描述】:

我有这份文件:

{
        "_id" : ObjectId("54140782b6d2ca6018585093"),
        "user_id" : ObjectId("53f4ae1ae750619418a20467"),
        "date" : ISODate("2014-09-13T08:59:46.709Z"),
        "type" : 0,
        "tot" : 2,
        "additional_info" : {
                "item_id" : ObjectId("540986159ef9ebafd3dcb5d0"),
                "shop_id" : ObjectId("53f4cc5a6e09f788a103d0a4"),
                "ap_id" : ObjectId("53f4cc5a6e09f788a103d0a5")
        },
        "transactions" : [
                {
                        "_id" : ObjectId("54140782b6d2ca6018585091"),
                        "date_creation" : ISODate("2014-09-13T08:59:46.711Z"),
                        "type" : -1
                },
                {
                        "_id" : ObjectId("54140782b6d2ca6018585092"),
                        "date_creation" : ISODate("2014-09-13T08:59:46.788Z"),
                        "type" : 1
                }
        ]
}

我需要在第一个事务对象中再添加 2 个字段: - date_execution:日期 - 结果:这个 bson 文档

{ "server_used" : "xxx.xxx.xxx.xxx:27017" , "ok" : 1 , "n" : 1 , "updated_executed" : true} (m_OR.getDocument() in the following code example)

获取该文件

    {
        "_id" : ObjectId("54140811b6d25137753c1a1a"),
        "user_id" : ObjectId("53f4ae1ae750619418a20467"),
        "date" : ISODate("2014-09-13T09:02:09.098Z"),
        "type" : 0,
        "tot" : 2,
        "additional_info" : {
                "item_id" : ObjectId("540986159ef9ebafd3dcb5d0"),
                "shop_id" : ObjectId("53f4cc5a6e09f788a103d0a4"),
                "ap_id" : ObjectId("53f4cc5a6e09f788a103d0a5")
        },
        "transactions" : [
                {
                        "_id" : ObjectId("54140811b6d25137753c1a18"),
                        "date_creation" : ISODate("2014-09-13T09:02:09.100Z"),
                        "type" : -1,
                        "result" : {
                                "server_used" : "xxx.xxx.xxx.xxx:27017",
                                "ok" : 1,
                                "n" : 1,
                                "updated_executed" : true
                        },
                        "date_execution" : ISODate("2014-09-13T09:02:15.370Z")
                },
                {
                        "_id" : ObjectId("54140811b6d25137753c1a19"),
                        "date_creation" : ISODate("2014-09-13T09:02:09.179Z"),
                        "type" : 1
                }
        ]
}

我能够做到这一点的唯一方法是 do 2 分离更新(更新是我的包装函数,它在 mongodb 中执行真正的更新,它工作正常):

    // where
    BasicDBObject query = new BasicDBObject();
    query.append("transactions._id", m_Task.ID());

    // new value for result - 1st upd
    BasicDBObject value = new BasicDBObject();
    value.put("$set",new BasicDBObject("transactions.$.date_execution",new Date()));
    update(this._systemDB, "activities", query, value);

    // new value for date_execution - 2nd upd
    value = new BasicDBObject();
    value.put("$set",new BasicDBObject("transactions.$.result",m_OR.getDocument()));
    update(this._systemDB, "activities", query, value);

如果我尝试这样做:

    BasicDBObject value = new BasicDBObject();
    value.put("$set",new BasicDBObject("transactions.$.date_execution",new Date()));
    value.put("$set",new BasicDBObject("transactions.$.result",m_OR.getDocument()));
    or = update(this._systemDB, "activities", query, value);

只会应用第二组。

有没有什么办法可以避免双重执行,只需一次调用即可应用更新?

【问题讨论】:

    标签: java mongodb mongodb-query


    【解决方案1】:

    “hash/map”对象的基本规则是你只能有一个键。这是普遍适用的“高地人”规则(“只能有一个”)。所以只是应用不同:

    BasicDBObject value = new BasicDBObject();
    value.put("$set",
        new BasicDBObject("transactions.$.date_execution",new Date())
            .add( new BasicDBObject("transactions.$.result",m_OR.getDocument() )
    );
    

    所以基本上“两个”字段参数都是序列化形式的“$set”语句的一部分:

    {
       "$set": {
           "transactions.$.date_execution": new Date(),
           "transactions.$.result": m_Or.getDocument()
       }
    }
    

    这基本上就是你最终想要的。

    【讨论】:

      【解决方案2】:

      你的建议是对的,只需要这样修正一点语法:

      BasicDBObject value = new BasicDBObject();
      value.put("$set",
              new BasicDBObject("transactions.$.date_execution",new Date())
              .append("transactions.$.result",m_OR.getDocument())
      );
      

      这很完美;)

      谢谢! 塞缪尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-29
        • 2015-01-15
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多