只需要更新java中mongo数组中的特定元素

时间:2019-04-30 09:58:41

标签: java arrays mongodb filter

我想用过滤器更新mongo数组中的特定元素。

我已经尝试过使用BasicDBObject,但是由于我有MongoCollection类型的集合,因此无法使用过滤器。

MongoCollection collection = db.getCollection(tnId);

甚至尝试过:

FindIterable<Document> document = collection.find(new BasicDBObject("DocumentName", documentName)                       .append("Attributes.name", "Party 1" ).append("Attributes.value", 12)                   .append("Attributes.actualValue.initialValue", USA));

但是在这种情况下,我得到的是整个记录,然后我不得不再次遍历每个属性。

mongo = new MongoClient("localhost", 27017);
MongoDatabase db = mongo.getDatabase(companyName);
MongoCollection collection = db.getCollection(tnId);

我要传递的实际数据是

{
    "DocumentName" : "doc1",
    "Attributes" : [ 
        {
            "name" : "Party 1",
            "value" : 12,
            "actualValue" : {
                "initialValue" : "USA"
            }
        }, 
        {
            "name" : "Party 1",
            "value" : 16,
            "actualValue" : {
                "initialValue" : "SYSTEM"
            }
        }
    ]
}

我要搜索的值的实际值是“ USA”,属性的值是12,更新后的数据应该像这样

{
    "DocumentName" : "doc1",
    "Attributes" : [ 
        {
            "name" : "Party 1",
            "value" : 12,
            "actualValue" : {
                "initialValue" : "USA"
            },
            "updatedvalue" : {
                "initialValue" : "USA",
                "changedValue" : "Europe"
             }

        }, 
        {
            "name" : "Party 1",
            "value" : 16,
            "actualValue" : {
                "initialValue" : "SYSTEM"
            }
        }
    ]
}

3 个答案:

答案 0 :(得分:1)

db.collection.findOneAndUpdate({ "Attributes.actualValue.initialValue": "USA" }, 
  { $set: { "Attributes.$.updatedvalue.initialValue": "USA",      "Attributes.$.updatedvalue.changedValue": "Europe" } })

db.collection.findOneAndUpdate({“ Attributes.actualValue.initialValue”:“美国”}, {$ set:{“ Attributes。$。updatedvalue.initialValue”:“印度”,“ Attributes。$。updatedvalue.changedValue”:“印度”}}}

答案 1 :(得分:0)

尝试这个

db.collection.updateMany(
 { "Attributes.actualValue.initialValue": "USA" },
 { $set: { "Attributes.$.updatedvalue" : {
            "initialValue" : "USA",
            "changedValue" : "Europe"
         } } }
)

答案 2 :(得分:0)

我的做法是。我做了一个文档,在其中添加了我想用来更新的必需数据。说

Document valueDocument = new Document();

valueDocument.put("InitialValue", USA);

BasicDBObject query = new BasicDBObject();
query.put("Attributes", att);

BasicDBObject data = new BasicDBObject();
data.put("Attributes.$.updatedvalue" + qCLevel, valueDocument);

BasicDBObject command = new BasicDBObject();
command.put("$set", data);
collection.updateOne(query, command);

它会在正确的位置插入数据。