【问题标题】:Python insert YAML in MongoDBPython 在 MongoDB 中插入 YAML
【发布时间】:2014-02-12 04:41:53
【问题描述】:

各位, 将以下 yaml 文档插入 MongoDB 时出现问题:

作品:

---
URLs: 
  - "http://www.yahoo.com":
    intensity: 5
    port: 80

没有:

---
URLs: 
  - "foo":
    intensity: 5
    port: 80

唯一的区别是网址。这是python代码:

    stream = open(options.filename, 'r')
    yamlData = yaml.load(stream)
    jsonData = json.dumps(yamlData)
    io = StringIO(jsonData)
    me = json.load(io)

    ... calling classes, etc, then
    self.appCollection.insert(me)

错误:

 bson.errors.InvalidDocument: key 'http://yahoo.com' must not contain '.'

那么,转换这个 YML 文件的正确方法是什么? :)

谢谢!

【问题讨论】:

  • 根据stackoverflow.com/questions/21201661/…,我应该替换'.'在带有 _ 的键中听起来并不有趣。这是正确的方法吗?
  • 最好不要在 MongoDB 中使用来自外界的任意键。使用 URL 作为键是有问题的做法。例如,现在您无法索引所有 URL。最好重新设计您的架构,使文档类似于 {"url": "example.com"}。然后你可以在“url”上声明一个索引并搜索它们,现在你不必用其他字符替换点。

标签: python mongodb yaml pymongo


【解决方案1】:

您不能使用“。”在字段名称(即键)中。如果必须,则替换出现的“。”使用 unicode 表示“\uff0E”。

希望这会有所帮助。

【讨论】:

  • 我将如何循环并用\uff0E替换所有.
  • me.replace(".", "\uff0E")
  • AttributeError: 'dict' 对象没有属性 'replace'
  • 对不起,我在引用字符串对象时使用了“me”,在你的示例中你会是 io 吗?
  • stream = open(options.filename, 'r').read().replace(".", "\uff0E")
【解决方案2】:

正如错误所说,您的密钥中有错误。 MongoDB 使用点作为嵌套文档键,您不能将包含点的键作为键的一部分。

【讨论】:

  • 什么是正确的方法来转换它以保存这个正确的 JSON 文档?
  • 这确实是一个应用程序级别的转换,需要有意义地完成以适应您想要使用的场景。 IE。你想反向转换吗?
猜你喜欢
  • 2020-04-30
  • 2012-05-04
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2017-04-03
  • 2013-05-21
相关资源
最近更新 更多