使用推和切片更新

时间:2019-10-09 16:32:55

标签: arrays mongodb mongodb-query aggregation-framework

我在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 :(得分:0)

我想您在进行汇总时有些困惑,您想做的是更新。对您的更新进行了一些小的更正(删除了[]$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
            }
        }
    }
)