我想在这些数据上创建一个更新脚本:
{
"_id" : ObjectId("5b87e83d881ba01dfc3b0367"),
"Views" : [
{
"ReportUniqueKey" : "AAA",
"GroupMode" : NumberInt("0"),
"DisplayName" : "Default",
"Columns" : [],
"UnusedOptionalFilterParameter" : null,
"IsDefault" : true,
"LastModified" : ISODate("0001-01-01T01:00:00.000+01:00"),
"LastModifiedUserId" : NumberInt("0"),
"Guid": "6988FBD83E5A4C889E8E96646033D836"
},
{
"ReportUniqueKey" : "9E91595D92DE4E01B72895B1B88C474D",
"GroupMode" : NumberInt("0"),
"DisplayName" : "Pro Tour",
"Columns" : [],
"UnusedOptionalFilterParameter" : null,
"IsDefault" : false,
"LastModified" : ISODate("2018-08-03T13:13:20.330+02:00"),
"LastModifiedUserId" : NumberInt("1")
}
]}
这只是一个文件,其中有更多。现在我想更新字段“Guid”不存在的所有视图对象或null /空字符串。如果Guid设置为Value,则不更新Field。
Guid由此函数生成:
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);}
function generateGuid(){
return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4()).toUpperCase();}
如何为所有文档实现此更新?我在MongoDB网站上发现了这个,但我不知道如何进入数组。
db.TestGuid.aggregate([{$project:{Guid:{$ifNull: [ "$Guid", "Test"]}}}])
如何让这个脚本在一个对象数组上工作?
我编写了一个c#脚本来执行此操作以生成更好的Guid。我用这个命令添加了Field:
var pipeline = new[] { new BsonDocument() { { "$addFields", new BsonDocument() { { "Views.Guid", "" } } } } };
然后我为MongoDriver加载所有文档,并为每个Document设置一个新的Guid。
我还在Columns字段中对元素进行排序,因此c#脚本对我来说更好。