【发布时间】:2020-02-03 07:45:38
【问题描述】:
有人可以看看这个问题,因为我们无法在字段“d”中插入数组,如下图所示:
[![MongoDB 中的 JSON 结构][1]][1]
{
"id": 12,
"articles": "art",
"author": "author"
}
【问题讨论】:
标签: java arrays mongodb mongodb-java
有人可以看看这个问题,因为我们无法在字段“d”中插入数组,如下图所示:
[![MongoDB 中的 JSON 结构][1]][1]
{
"id": 12,
"articles": "art",
"author": "author"
}
【问题讨论】:
标签: java arrays mongodb mongodb-java
您必须使用arrayFilters 来更新特定的数组元素(带有条件)。 Java 中的数组过滤器是用FindOneAndUpdateOptions 对象定义的。
List<Bson> arrFilters = new ArrayList<>();
arrFilters.add(new Document("elem.apn", "abcdef")); // this specifies the element search criteria
FindOneAndUpdateOptions updateOptions = new FindOneAndUpdateOptions().arrayFilters(arrFilters);
String [] dArray = { "app", "ban", "ora" }; // the "d" array to be added
Bson update = set("session.ps.$[elem].d", Arrays.asList(dArray));
String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));
Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
System.out.println(result);
Mongo Shell 中相同的更新操作:
var dArray = [ "app", "ban" ];
db.test.updateOne(
{ _id: ObjectId("5e37dc262f5ff4dfc935eb6b") },
{ $set: { "session.ps.$[elem].d" : dArray } },
{
arrayFilters: [ { "elem.apn": "abcdef" } ]
}
)
同时使用新值“newVal”更新apn并将新字符串元素“gua”添加到d 数组(如果数组没有,这将添加一个新数组' t 存在):
db.test.updateOne(
{ _id: ObjectId("5e37dc262f5ff4dfc935eb6b") },
{
$set: { "session.ps.$[elem].apn": "newVal" }
$push: { "session.ps.$[elem].d" : "gua" }
},
{
arrayFilters: [ { "elem.apn": "abcdef" } ]
}
)
上述Mongo Shell代码的Java代码:
List<Bson> arrayFilters = new ArrayList<>();
arrayFilters.add(new Document("elem.apn", "abcdef"));
FindOneAndUpdateOptions updateOptions =
new FindOneAndUpdateOptions().arrayFilters(arrayFilters);
Bson pushUpdate = push("session.ps.$[elem].d", "gua");
Bson setUpdate = set("session.ps.$[elem].apn", "newValue");
Bson update = combine(pushUpdate, setUpdate);
String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));
Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
【讨论】:
eq 和 set 静态方法来自 com.mongodb.client.model.Filters 和 com.mongodb.client.model.Updates 类。
apn 字段。