脚本以确保字段的正确类型?

时间:2014-07-16 09:06:20

标签: mongodb mongodb-query

在执行应用程序脚本期间,我收到的错误如下:

failed with error 16837: "The field 'tags' must be an array but is of type String in document {_id: ObjectId('4f870265bb94786e84002f56')}"

似乎对象映射器在名为tags的字段中保存了一个数组,但是我的一些现有文档的字符串为空字符串或空值。

所以,我想创建一个遍历所有现有记录的脚本,如果tags值不是数组,则用空数组替换它。 它是最适合您的解决方案吗?我该怎么做?

感谢。

2 个答案:

答案 0 :(得分:3)

这基本上应该工作,没有循环:

 db.collection.update(
     { 
         "$or": [ 
             { 
                 "field.0": { "$exists": false },
                 "field": { "$ne": [] } 
             },
             { "field": { "$exists": false }  },
         ]
     },
     { "$set": { "field": [] }},
     { "multi": true }
 )

因此,如果该字段不是非空数组或根本不存在,则将其替换为空数组。 Multi更新所有内容。

以下是一个例子:

{ "field" : "a" }
{ "field" : null }
{ "field" : [ "A" ] }
{ "field" : [ ] }
{ "abc" : "abc" }

然后运行更新并:

{ "field" : [ ] }
{ "field" : [ ] }
{ "field" : [ "A" ] }
{ "field" : [ ] }
{ "abc" : "abc", "field" : [ ] }

更新实际上只触及了“三个”文件。

答案 1 :(得分:1)

您必须遍历所有文档并分别检查每个文档:

db.collection.find().forEach( function( doc ) {
  if ( !Array.isArray( doc.tags ) ) {
    // tags is not an array! Correct it.
    doc.tags = Array( doc.tags );
    // save the document after modifications
    db.collection.save( doc );
  }
} );