1

所以我有一个像这样的 mongo 文档,我需要根据 val 更新数组

{
"_id" : NumberLong(222),
"pattern":"grain"
"BASIC" : {
    "frame":"clear"
    "tin" : [ 
        {
            "val" : "abc",
            "unit" : NumberLong(2311)
        }, 
        {
            "val" : "def",
            "unit" : NumberLong(2311)
        }, 
    ]
}
}

这是我尝试过的代码

        collection = db.getCollection("test");
    Bson where = new Document().append("_id", 222).append("BASIC.tin.val","abc");

     Bson update = new Document()
                .append("BASIC.tin.$.val", "xyz");
     Bson set = new Document().append("$set", update);
        try {

            UpdateResult result = collection.updateOne(where , set, new UpdateOptions().upsert(true));

            if(result.getMatchedCount()>0){
                System.out.println("updated");
                System.out.println(result.getModifiedCount());
            }else{
                System.out.println("failed");
            }
        } catch (MongoWriteException e) {
          e.printStackTrace();
        }

更新工作正常,但如果查找失败则不会更新这是我得到的错误:

com.mongodb.MongoWriteException:位置运算符未从查询中找到所需的匹配项。未扩展更新:com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:558) 处的 BASIC.tin.$.val.mongoCollectionImpl.update(MongoCollectionImpl.java:542)

4

1 回答 1

2

无法插入到嵌入文档中,因此会出现错误。因此,要模拟嵌入式文档的 upsert,您需要更新您的代码,如下所示。这将检查修改后的计数,如果它为 0,则意味着我们需要在嵌入文档中插入一个新文档,该文档为此使用推送。对于您拥有的示例文档,这将使用“pqr”作为 val 和“unit”作为 400 执行 upsert。

Bson where = new Document().append("_id", 222).append("BASIC.tin.val","pqr");

Bson update = new Document()
        .append("BASIC.tin.$.val", "xyz");
Bson set = new Document().append("$set", update);

try {

    UpdateResult result = collection.updateOne(where , set, new UpdateOptions());

    if(result.getModifiedCount() > 0){
        System.out.println("updated");
    } else if(result.getModifiedCount()==0){
          System.out.println("upserting");
          Bson where1 = new Document().append("_id", 222);
          Bson upsert = new Document().append("BASIC.tin", new Document().append("val", "pqr").append("unit", 400));;
          Bson push = new Document().append("$push", upsert);
          UpdateResult result1 = collection.updateOne(where1 , push, new UpdateOptions());
          if(result1.getModifiedCount() == 1)
              System.out.println("upserted");
    }else {
        System.out.println("failed");
    }
} catch (MongoWriteException e) {
  e.printStackTrace();
}

插入后的示例响应

{
    "_id": NumberLong(222),
    "pattern": "grain",
    "BASIC": {
        "frame": "clear",
        "tin": [{
            "val": "xyz",
            "unit": NumberLong(2311)
        }, {
            "val": "def",
            "unit": NumberLong(2311)
        }, {
            "val": "pqr",
            "unit": 400
        }]
    }
}
于 2016-12-13T02:20:26.190 回答