这是我存储到集合中的文档:
{
"_id" : UUID("61a2053c-1a79-4649-8793-df6c4dc1973"),
"NotificationId" : UUID("ad068e4e-10e2-528c-a74a-df6c4dd9211"),
"DistributionId" : UUID("f5445ea1-e6cb-4acd-9881-c4122df6c4d"),
"CreationDateTime" : ISODate("2016-07-13T04:20:38.697Z"),
"ExpirationDateTime" : ISODate("2099-01-01T00:00:00.000Z"),
"DeliveryType" : 1,
"DeliveryParams" : [],
"Address" : "Topics/Messages/Global",
"Payload" : "{\"Id\":\"ad067896-10e2-528c-er87-df6c4d123654\",\"CreationDateTime\":\"\\/Date(1468324824751)\\/\",\"DeviceId\":\"456987456985\",\"UserId\":\"64545678-1234-4834-4321-123456789012\",\"UserFullName\":\"test-user\",\"SystemId\":\"com.messaging\",\"SystemTitle\":\"message\",\"EventId\":\"messaging.message\",\"EventTitle\":\"ارسال پیام\",\"EventData\":[],\"BusinessCode\":\"1-2-4-4-5-6-9\",\"ProcessId\":\"55333333-4433-3333-7733-113333333399\",\"WorkItemId\":423458,\"WKT\":\"\"}",
"SendAttempts" : null,
"Sent" : ISODate("2016-11-10T10:01:22.140Z"),
"Delivered" : ISODate("1970-01-01T00:00:00.000Z")
}
我的问题是,我怎么能把\"BusinessCode\":\"1-2-4-4-5-6-9\"
分开
有效负载字段。我只需要 BusinessCode:1-2-4-4-5-6-9 来存储到其他领域。
我用过这个脚本:
db.Messages.find().forEach(function(item)
{
id = item._id;
payload = item.Payload;
matched = payload.match(/\"BusinessCode\":\"(([1-2]?[0-9])-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*))\"/);
....
db.Messages.updateOne(
....
此payload.match
返回
BusinessCode":"1-2-4-4-5-6-9",1-2-4-4-5-6-9,1,2,4,4,5,6,9
这个用于收集许多文档的脚本不合适且速度很慢。我想使用聚合管道。
如何将payload.match
之类的完全相同的响应转换为聚合管道?
答案 0 :(得分:1)
从3.6.2开始,我们在mongo中没有regexp子字符串
我们可以使用substr方法对业务ID进行子串,因为有效负载包含unicode字符,我们需要使用CodePoint(CP)来获得预期的结果
db.col.aggregate(
[
{$addFields : {
start : {$indexOfCP : ["$Payload", "BusinessCode"]},
end : { $indexOfCP : ["$Payload", "ProcessId"]}
}
},
{$project : {BusinessCode : {$substrCP : ["$Payload", {$sum : ["$start",15]}, {$subtract : [{$subtract : ["$end", "$start"]}, 18]}]}}}
]
)
结果
{ "_id" : "61a2053c-1a79-4649-8793-df6c4dc1973", "BusinessCode" : "1-2-4-4-5-6-9" }