MongoDB: создавать поля, только если не существует

Я хочу создать скрипт обновления для этих данных:

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

Это только один документ, их больше. Теперь я хочу обновить все объекты Views, где поле "Guid" не существует или пустая / пустая строка. Если Guid установлен на Значение, не обновляйте Поле.

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

Как я могу получить этот скрипт для работы с массивом объектов?

1 ответ

Решение

Я написал сценарий C# для выполнения этого действия, чтобы создать лучший Guid. Я добавил поле с помощью этой команды:

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

Затем я загружаю все документы в MongoDriver и устанавливаю новый Guid для каждого документа.

Я также сортирую элементы в поле "Столбцы", так что сценарий aC# лучше для меня.

Другие вопросы по тегам