MongoDB位置运算符$在java中不起作用



我在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。要应用的更新必须仅包括更新操作员

$定义为与更新方法一起使用的数组操作员。

请参阅此处

相关内容

  • 没有找到相关文章