Mongodb — Обновить значение ключевого значения массива объекта

#mongodb

#mongodb

Вопрос:

У меня в коллекции есть следующие документы.

 { 
    "_id" : ObjectId("5c98760c27b9fb1266f996b3"), 
    "user_id" : ObjectId("5c8109785b9a5427b167542a"), 
    "permissions" : [
        {
            "dashboard" : [
                "Pie Chart", 
                "Bar Chart"
            ], 
            "product management" : [
                "update", 
                "delete", 
                "list", 
                "insert"
            ], 
            "app user listing" : [
                "insert", 
                "update", 
                "delete", 
                "list"
            ]
        }
    ]
}
  

Я пытаюсь выполнить следующий запрос:

 db.user_permissions.update(

    { user_id: ObjectId("5c8740860c5dcf6c615c1ba3") },
    { 
        "permissions.app user listing": ['inserts']
    }

)
  

что я хочу сделать, так это обновить значение «список пользователей приложения».

Любая помощь приветствуется.

Редактировать: Это то, что я хочу

Ожидаемый результат:

 { 
    "_id" : ObjectId("5c98760c27b9fb1266f996b3"), 
    "user_id" : ObjectId("5c8109785b9a5427b167542a"), 
    "permissions" : [
        {
            "dashboard" : [
                "Pie Chart", 
                "Bar Chart"
            ], 
            "product management" : [
                "update", 
                "delete", 
                "list", 
                "insert"
            ], 
            "app user listing" : [
                "inserts"
            ]
        }
    ]
}
  

Я хочу обновить значение данного ключа с помощью массива.

Комментарии:

1. почему бы вам не изменить имя атрибута на регистр snake? т.е. app_user_listing ?

2. Удалить ObjectId из обновления соответствие также: {user_id : "5c8740860c5dcf6c615c1ba3"} было бы достаточно

3. @vahdet это не работает / не будет работать

4. @Kai Я хотел бы

5. В целом, какая у вас проблема с вашим текущим кодом? Он ничего не обновляет? Выдает исключение и т.д.?

Ответ №1:

Это работает на всех версиях mongo, вам нужен второй аргумент для поиска,

     db.myColl.update( 
    {
        "user_id" : ObjectId("5c8109785b9a5427b167542a"),"permissions.app user listing":["insersssts"] 
    },
    {
        $set: {
        "permissions.$.app user listing":["insertss"]      
    }
    });
  

Ответ №2:

Попробуйте, как показано ниже:

 db.user_permission.update(
    {
        "user_id" : ObjectId("5c8109785b9a5427b167542a")
    },
    {
        $set: {
            "permissions.$[].app user listing": ['inserts']
        }
    },
    {
        upsert:false
    }
)
  

Данные перед выполнением запроса :

 {
    "_id" : ObjectId("5c98760c27b9fb1266f996b3"),
    "user_id" : ObjectId("5c8109785b9a5427b167542a"),
    "permissions" : [
        {
            "dashboard" : [
                "Pie Chart",
                "Bar Chart"
            ],
            "product management" : [
                "update",
                "delete",
                "list",
                "insert"
            ],
            "app user listing" : [
                "insert",
                "update",
                "delete",
                "list"
            ]
        }
    ]
}
  

После выполнения запроса:

 {
    "_id" : ObjectId("5c98760c27b9fb1266f996b3"),
    "user_id" : ObjectId("5c8109785b9a5427b167542a"),
    "permissions" : [
        {
            "dashboard" : [
                "Pie Chart",
                "Bar Chart"
            ],
            "product management" : [
                "update",
                "delete",
                "list",
                "insert"
            ],
            "app user listing" : [
                "inserts"
            ]
        }
    ]
}
  

Комментарии:

1. Вы тестировали это? Это ошибка cannot use the part (permissions of permissions.$[].app_user_listing) to traverse the element ({permissions: [ { dashboard: [ "Pie Chart", "Bar Chart" ], product management: [ "update", "delete", "list", "insert" ], app user listing: [ "inserts" ] } ]})

2. Эта ошибка может быть вызвана подчеркиванием. Я обновил свой пост, чтобы попробовать еще раз. И я протестировал его с моей стороны, он работает нормально.

3. Я пытался без использования символов подчеркивания (так же, как в вашем случае). и это также работает.

4. будет ли оно использоваться в waterline orm?

5. Я запускаю этот запрос в графическом интерфейсе mongodb «NoSqlBooster».