MongoDB:仅在不存在时创建字段

时间:2018-09-03 07:39:24

标签: mongodb aggregate

我要为此数据创建一个更新脚本:

{
"_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 / Empty字符串的所有Views对象。如果Guid设置为Value,则不要更新该字段。

向导是通过以下功能生成的:

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"]}}}])

如何使此脚本在对象数组上工作?

1 个答案:

答案 0 :(得分:0)

我已经编写了一个c#脚本来执行此操作以生成更好的Guid。我使用以下命令添加了字段:

var pipeline = new[] { new BsonDocument() { { "$addFields", new BsonDocument() { { "Views.Guid", "" } } } } };

然后,我每个MongoDriver加载所有文档,并为每个文档设置新的Guid。

我还对Columns字段中的元素进行了排序,因此c#脚本对我来说更好。