【问题标题】:MongoDB Property IterationMongoDB 属性迭代
【发布时间】:2015-05-27 23:46:19
【问题描述】:

我试图对 MongoDB 的工作原理有一个基本的了解,但无法找到解决的这个问题。我认为这是不可能的,但也许我错了?

鉴于以下 JSON 结构:

{
"bob": { "height": 68, "gender": "m" },
"sally": { "height": 48, "gender": "f" }
}

当这个结构被反序列化为 JavaScript 时,我可以轻松地迭代这个对象的属性来获取人员列表。请注意,此人员列表可以/将是动态的。因此,有时“bob”不存在,有时“mike”可能存在,等等。

但是,对于 MongoDB 查询,这似乎是不可能的。 MongoDB 似乎要求这样的数据在一个数组中。然后我可以向下查询“人”数组,然后对其进行迭代。

我想确认一下,MongoDB 引擎确实不能像 JS 那样迭代属性。如果这是真的,我想这是有道理的。由于 JSON 结构将数据和模式都表示在一个整体中,因此具有这样的动态属性可能会使文档难以(即使不是不可能)索引。所以也许这就是原因?我希望有人能证实。

我希望我可以使用 MongoDB 来存储返回我的 UI 的相同 JSON 结构,但我认为该结构需要修改为如下所示的数据存储。

{ "people": [{
"name": "bob", "height": 68, "gender": "m" }, {
"name": "sally", "height": 48, "gender": "f" }]
}

【问题讨论】:

  • 你看过stackoverflow.com/questions/2298870/…它可能会提供一些见解。
  • 谢谢@DaveCoast,在我所有的搜索中我都没有看到。很有意思。就我而言,它可能会有所帮助,但我必须运行 map-reduce 操作,然后从该结果返回并再次查询。对于需要付出的努力,我可能最好重组我的数据以更好地适应 DBMS。

标签: javascript json mongodb


【解决方案1】:

没错。除了显式命名键外,MongoDB 没有基于键名操作文档的功能。一个例外是服务器端 javascript,由于安全和性能问题,您应该避免使用它。原则是“不以数据为键”;数据应该在值中,键给出特定的、不变的名称,用于构造查询。在您的情况下,最自然的结构似乎是让每个文档都代表一个person,就像这样

{
    "name" : "bob",
    "height" : 68,
    "gender" : "m"
}

我认为没有理由将人们放在一个数组中而不是单独的文档中。不过,您的用例中的其他一些因素可能会推荐它。

【讨论】:

  • 感谢@wdberkeley 为我确认。
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2019-02-11
  • 2019-09-12
  • 2015-10-24
相关资源
最近更新 更多