我试图从根本上了解MongoDB如何工作,并且无法找到这个问题。我认为这是不可能的,但也许我错了?
给出以下JSON结构:
{
"bob": { "height": 68, "gender": "m" },
"sally": { "height": 48, "gender": "f" }
}
当这个结构被反序列化为JavaScript时,我很容易迭代这个对象的属性来获取人员列表。请注意,此人员列表可以/将是动态的。因此,有时“bob”将不存在,有时可能存在“mike”等等。
然而,使用MongoDB查询,这似乎不可能。 MongoDB似乎要求这样的数据在数组中。然后我可以向下查询“people”数组,然后迭代它。
我想确认一下,事实上,MongoDB引擎无法像JS那样迭代属性。如果这是真的,我想这是有道理的。由于JSON结构同时表示数据和模式,因此具有这样的动态属性可能会使文档难以(如果不是不可能)进行索引。也许这就是原因?我希望有人能证实。
我希望我可以使用MongoDB存储返回我的UI的相同JSON结构,但我认为需要将结构修改为类似以下内容的数据存储。
{ "people": [{
"name": "bob", "height": 68, "gender": "m" }, {
"name": "sally", "height": 48, "gender": "f" }]
}
答案 0 :(得分:2)
没错。除了明确命名密钥外,MongoDB还没有基于密钥名称操作文档的功能。唯一的例外是服务器端javascript,由于安全性和性能问题,您应该避免使用它。原则是“不要使用数据作为密钥”;数据应该是值,并且键提供用于构造查询的特定,不变的名称。在您的情况下,最自然的结构似乎是每个文档都代表person
,如此
{
"name" : "bob",
"height" : 68,
"gender" : "m"
}
先验我认为没有理由将人们组合在一个数组而不是单独的文档中。但是,您的用例中的其他一些因素可能会推荐它。