我在mongoDB中有以下JSON数据,需要更新使用TraceID作为搜索键提交的状态。
{
"_id" : ObjectId("59cd4ec748eecac127d4ed11"),
"mode" : "Email",
"text" : "template",
"subject" : "EIS Order Number EO17000988 - Notice Type SOA",
"scenario" : "SendCustomerNoticeGenericEvent",
"system" : "CIS",
"traceId" : NumberInt(676517451),
"timestamp" : ISODate("2017-09-27T19:20:10.860+0000"),
"recipients" : [
{
"status" : "Delivered",
"firstName" : " ",
"lastName" : " ",
"address" : "ao084x@att.com",
"type" : "to"
}
],
"from" : {
"firstName" : "AT&T Enterprise Notifications",
"lastName" : " ",
"address" : "blink@zld00826.vci.att.com"
}
}
当我在下面的弹簧启动框架下运行Java代码时,我总是会出现错误:"位置操作员没有从查询中找到所需的匹配。不注重的更新:收件人。$。状态"。但是,如果我将位置运算符$更改为数字0,则代码有效。为什么$符号在这里不起作用?请帮忙。预先感谢。
MongoCollection<Document> collection = db.getCollection("notifyHistoryDbmS");
BasicDBObject updateDoc = new BasicDBObject("$set", new BasicDBObject("recipients.$.status", status));
BasicDBObject query = new BasicDBObject().append("traceId", Integer.valueOf(traceId));
UpdateResult statusUpdate = collection.updateOne(query, updateDoc);
您要做的仅由MongoDB的预览版本(3.5.12 )支持。请参阅:https://jira.mongodb.org/browse/server-1243
db.notifyHistoryDbmS.insertOne({
"_id" : ObjectId("59cd4ec748eecac127d4ed11"),
"mode" : "Email",
"text" : "template",
"subject" : "EIS Order Number EO17000988 - Notice Type SOA",
"scenario" : "SendCustomerNoticeGenericEvent",
"system" : "CIS",
"traceId" : NumberInt(676517451),
"timestamp" : ISODate("2017-09-27T19:20:10.860+0000"),
"recipients" : [
{
"status" : "Delivered",
"firstName" : " ",
"lastName" : " ",
"address" : "ao084x@att.com",
"type" : "to"
}
],
"from" : {
"firstName" : "AT&T Enterprise Notifications",
"lastName" : " ",
"address" : "blink@zld00826.vci.att.com"
}
});
,然后以下呼叫导致您看到的错误消息。
db.notifyHistoryDbmS.updateOne(
{ "traceId": 676517451 },
{ "$set": { "recipients.$.status": "Sent" } },
{ "multi": true }
)
您有两个选择:
- 单独更新数组的元素收件人(您已经尝试过此元素)
- 获取整个文档,对其进行所需的修改,然后替换
$不起作用,因为您正在使用UpdateOne。
根据mongo java驱动程序 updateOne 方法采用2个参数
过滤器 - 描述查询过滤器的文档,该文档可能不是null。
update - 描述更新的文档,该文档可能不是null。要应用的更新必须仅包括更新操作员。
$定义为与更新方法一起使用的数组操作员。
请参阅此处