Обновите массив MongoDB с помощью Push и Slice - PullRequest
0 голосов
/ 09 октября 2019

У меня есть документ в MongoDB, который я хочу обновить. В этом примере у меня есть свойство (events.properties.color), которое представляет собой массив с несколькими (дублирующимися) значениями.

{ 
    "_id" : ObjectId("5d91fd51abe17b722ca9c82c"),  
    "createdDate" : ISODate("2019-09-30T13:04:15.077+0000"), 
    "title" : "My Old Car", 
    "version" : NumberInt(0) 
    "events" : [
        { 
            "properties" : {
                "color" : [
                    "red", 
                    "red", 
                    "red", 
                    "red"
                ]
            }, 
            "attributes" : {
                "MAKE" : "TOYOTA", 
                "MODEL" : "COROLLA", 
                "YEAR" : "1991", 
            }
        }
    ]
}

Я хочу изменить этот массив на строку с одним значением (красным). Что касается моих данных, я могу предположить, что каждое значение в массиве одинаково, поэтому значение строки может быть просто первым значением в массиве. Я пытался перебрать мою коллекцию примерно так:

db.getCollection('cars').update(
    [
        // Match array with >1 value
        { $match: { 'events.properties.color.2': {$exists: true} } },

        {
            //Slice to only include first value in array. 
            $push:{
                'events.$.properties.color':{
                    $each: [ ],
                    $slice: 1
                }
            }
        }
    ]
)

Но я продолжаю получать ошибку: «Нужен объект», что (я думаю) означает, что я не ссылаюсь на массив цветовдолжным образом. Любые идеи о том, что я должен изменить? Спасибо!

1 Ответ

0 голосов
/ 09 октября 2019

Я думаю, вы немного запутались в агрегации, когда вы хотите сделать обновление. Внесены некоторые незначительные исправления в ваше обновление (удалены [] и $match):

db.books.update(
    // Match array with >1 value
    {'events.properties.color.2': {$exists: true}} ,
    {
        //Slice to only include first value in array. 
        $push:{
            'events.$.properties.color':{
                $each: [ ],
                $slice: 1
            }
        }
    }
)
...