Mongodb - E QUERY语法错误:意外的标识符

时间:2017-01-25 15:20:37

标签: mongodb

以下是我的MongoDb结构示例:

{
    "id" : 1,
    "children" : [ 
        {
            "id" : 2,
            "status" : "     fsdfsdf           "
        }, 
        {
            "id" : 3,
            "status" : "        ffdfg       "
        }, 
        {
            "id" : 4,
            "status" : "   fsdfsdfsdfdsf          "
        }
    ]
}

我想修剪mongodb中的记录,所以我做了:

db.getCollection('myCollectionName').find().forEach(function (doc){
  for (subDoc of doc.children) {
    if(typeof subDoc.status === 'string') {
      subDoc.theText = subDoc.theText.trim();
    }
  }
  db.getCollection('myCollectionName').save(doc);
})

但我收到了这个错误:

E QUERY SyntaxError:意外的标识符

1 个答案:

答案 0 :(得分:2)

您使用了错误的标识符 - 数组项没有theText标识符。

var docs = db.getCollection('myCollectionName').find()

docs.forEach(function (doc) {
    for (subDoc of doc.children) {
        if(typeof subDoc.status === 'string') {
          subDoc.status = subDoc.status.trim();
        }
    }

    db.getCollection('myCollectionName').save(doc);
})

分步说明

使用db stackoverflow打开本地mongo shell

⋊> ~ mongo stackoverflow
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/stackoverflow
MongoDB server version: 3.4.0

插入一个(您的)文件

> db.getCollection('myCollectionName').insertOne({
...     "id" : 1,
...     "children" : [
...         {
...             "id" : 2,
...             "status" : "     fsdfsdf           "
...         },
...         {
...             "id" : 3,
...             "status" : "        ffdfg       "
...         },
...         {
...             "id" : 4,
...             "status" : "   fsdfsdfsdfdsf          "
...         }
...     ]
... })
{
    "acknowledged" : true,
    "insertedId" : ObjectId("588b4984522a4f31ff6bc738")
}

查找插入的文档

> db.getCollection('myCollectionName').findOne()
{
    "_id" : ObjectId("588b4984522a4f31ff6bc738"),
    "id" : 1,
    "children" : [
        {
            "id" : 2,
            "status" : "     fsdfsdf           "
        },
        {
            "id" : 3,
            "status" : "        ffdfg       "
        },
        {
            "id" : 4,
            "status" : "   fsdfsdfsdfdsf          "
        }
    ]
}

我使用findOne,因为我在db中只知道一个文档。在正常情况下,您需要使用findpretty来查找集合中的所有文档

> db.getCollection('myCollectionName').find().pretty()

在集合中查找文档并将光标保存在变量

> var docs = db.getCollection('myCollectionName').find()

在文档中的数组status中运行修剪字段children的函数

> docs.forEach(function (doc) {
...     for (subDoc of doc.children) {
...         if(typeof subDoc.status === 'string') {
...           subDoc.status = subDoc.status.trim();
...         }
...     }
...
...     db.getCollection('myCollectionName').save(doc);
... })
  

生产的改进:仅查找包含字段子项的文档并将字段检入文档。

检查结果(找到文件)

> db.getCollection('myCollectionName').findOne()
{
    "_id" : ObjectId("588b4984522a4f31ff6bc738"),
    "id" : 1,
    "children" : [
        {
            "id" : 2,
            "status" : "fsdfsdf"
        },
        {
            "id" : 3,
            "status" : "ffdfg"
        },
        {
            "id" : 4,
            "status" : "fsdfsdfsdfdsf"
        }
    ]
}