mongodb - Elasticsearch mongo-connector KeyError _id

标签 mongodb elasticsearch

我正在使用 mongo-connector 与 elast2-doc-manager 作为文档管理器同步来自 mongoDB replicaSet 的数据。

我将 mongo-connector 运行为:

$mongo-connector --auto-commit-interval=5 --verbose -m 127.0.0.1:27017 -t localhost:9200 -d elastic2_doc_manager --namespace-set=db.collection1,db.collection2 --fields=f1,f2,f3

在某些时候,我得到了这个异常(exception):
Traceback (most recent call last):  
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/local/lib/python2.7/dist-packages/mongo_connector/util.py", line 85, in wrapped
    func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/mongo_connector/oplog_manager.py", line 261, in run
    docman.upsert(doc, ns, timestamp)
  File "/usr/local/lib/python2.7/dist-packages/mongo_connector/util.py", line 32, in wrapped
    return f(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/mongo_connector/doc_managers/elastic2_doc_manager.py", line 150, in upsert
    doc_id = u(doc.pop("_id"))

我添加了一个 try/except 包装方法 File "/usr/local/lib/python2.7/dist-packages/mongo_connector/doc_managers/elastic2_doc_manager.py" Line 148在异常情况下打印有问题的文档。

不知何故_id打印的文档中缺少。但是,如果我直接从交互式 cmd 查询 mongo,我可以获取相同的文档,并且 _id key 存在。

所以不知道为什么mongo-connector/elastic2_doc_manager没有看到 _id一些文件的属性。

最佳答案

无论出于何种原因,Mongo-connector 似乎删除了 _id从您的文档中。然而反过来,来自 mongodb 的 ObjectId 的字符串表示形式在 elasticsearch 中存储为 _id。它仍然存在,但它不在文档中,或者 Elasticsearch 将其称为“源”。

看一下查询结果,它的结构如下:

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "hits" : {
    "total" : 135513,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "myIndex",
      "_type" : "myType",
      "_id" : "5294b93e6c255bb82d0000c0", <-- ID from mongodb
      "_score" : 1.0,
      "_source":{
        "some": "data",
        "my": "document"
      },
      {
      "_index" : "myIndex",
      "_type" : "myType",
      "_id" : "5294b93e6c255bb82d0000de", <-- ID from mongodb
      "_score" : 1.0,
      "_source":{
        "some": "data2",
        "my": "document2"
      }
    }]
  }
}

我的印象是 mongo-connector 是故意这样做的。仅将 _id 存储在适当的 ES 字段中,尽管我看不出有理由从 _source 中删除 _id的文件以及。但是,我注意到在使用 elastic_doc_manager(v1) 时,ES 中的文档缺少 id。

关于mongodb - Elasticsearch mongo-connector KeyError _id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507387/

相关文章:

javascript - 查询嵌套对象键

javascript - 有没有一种 "good"方法可以从ES嵌套聚合中获取规范化的数据行?

scala - 使用elastic4s在搜索中获得零结果

c# - Linq to MongoDB 过滤器

full-text-search - Elastic Search 中的范围与术语提升

elasticsearch - 如何使用 Elasticsearch 和 Tire 防止附件存储在 _source 中?

c# - 使用 Nest 进行 Elasticsearch

node.js - Mongoose 更新推送到数组的开头

mongodb - Mongo Aggregate $project 变量作为字段名称

javascript - 带有子文档的复杂架构