我想用过滤器更新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"
}
}
]
}
答案 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);
它会在正确的位置插入数据。