在执行应用程序脚本期间,我收到的错误如下:
failed with error 16837: "The field 'tags' must be an array but is of type String in document {_id: ObjectId('4f870265bb94786e84002f56')}"
似乎对象映射器在名为tags的字段中保存了一个数组,但是我的一些现有文档的字符串为空字符串或空值。
所以,我想创建一个遍历所有现有记录的脚本,如果tags值不是数组,则用空数组替换它。 它是最适合您的解决方案吗?我该怎么做?
感谢。
答案 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 );
}
} );