如何更改字段以容纳对象数组?

时间:2019-07-05 12:24:45

标签: node.js mongodb mongoose

我正在使用mongodb存储数据。

我有一个“校园”字段来保存“校园”数据的ObjectId。

最初,用户只有一个校园,但后来必须修改校园类型以容纳一系列校园。但是最初的记录保持不变。

现在,当我尝试推送新的CampusId时,由于类型更改,某些记录未更新。

我有大约500条记录,其中一些记录具有单个objectId,而在某些记录中,校园是一个ObjectId数组。

喜欢这个

“ campusIds”:ObjectId(“ 5c8f304a4350a990f7c40”)

然后

"campusIds" : [ 
        ObjectId("5d136de2a02b2c14947652"), 
        ObjectId("5d136f0da02b2c14947656"), 
        ObjectId("5d137082a02b2c14947658"), 
        ObjectId("5d14520da02b2c1494765c"), 
        ObjectId("5d1459dd81801aef0865a8") ]

由于大量记录,我无法手动更改mongodb中的记录。

是否可以将字段更改为数据库中的数组?

1 个答案:

答案 0 :(得分:0)

创建一个查询,该查询仅过滤字段存在且字段类型为Object {$type 7}的文档。然后,该查询的结果可用于对集合进行批量更新。 以下异步操作将执行上述操作:

(async () => {
    try {
        const docs = await db.collection('collectionName').find({
            'campus': {
                '$exists': true, 
                '$type': 7 
            }
        }).toArray()

        const ops = docs.map(({ _id, campus }) => ({
            'updateOne': { 
                'filter': { _id } ,              
                'update': { '$set': { 'campusIds': [campus] } } 
            } 
        }))

        db.collection('collectionName').bulkWrite(ops)
    } catch(err) {
        // handle error
    }
})()