让我以一种非常简单的方式提出我的问题。 这样:
{
"name": {
"first": "Joe",
"last": "Coconut"
}
}
或者这个:
{
"first_name": "Joe",
"last_name": "Coconut"
}
但是以一种非常基本的形式。如果我可以有5个嵌套对象而2个嵌套有更多列,该怎么办?!
- 原创 - 我理解mongoDB中的数据建模与应用程序的使用有关,但作为一般规则哪个模型更好?
{
"company": "Amc",
"clients": [
{
"name": "10Gen",
"contact": "01002033",
"contracts": {
"id": 123,
"price": 1200
}
},
{
"name": "Sun",
"contact": "677689",
"contracts": {
"id": 23,
"price": 34000
}
}
]
}
VS
{
"company": "Amc",
"10Gen": {
"123": 1200,
"contact": "01002033"
},
"Sun": {
"23": 34000,
"contact": "677689"
}
}
由于应用层负责大多数操作不是第二种方法更合适吗?
更好地构建数据是否是嵌套数据的不良做法?说5个嵌套文档?
我错过了一个非常明显的事实吗?
答案 0 :(得分:1)
仅供参考:
考虑一个非常大的文件。请考虑下面的示例(我已经为文档添加了少量密钥)。并考虑以下两个更新。
db.mytest.update({b_e : 1}, {$set : { b_e : 2}})
db.mytest.update({'b.e' : 1}, {$set : { 'b.e' : 2}})
在第二种情况下的MongoDB更新中,相对容易,因为不需要密钥迭代。第二次更新中的cpu活动相对较少。当文档包含大量密钥时,您将注意到此问题。在您的情况下,它无关紧要,因为文档非常小。
Mongo > db.mytest.find().pretty()
{
"_id" : ObjectId("5188aae4eadc531d7386f524"),
"a_b" : 1,
"a_c" : 1,
"b_c" : 1,
"b_d" : 1,
"b_e" : 1
}
{
"_id" : ObjectId("5188ab14eadc531d7386f525"),
"a" : {
"b" : 1,
"c" : 1
},
"b" : {
"c" : 1,
"d" : 1,
"e" : 1
}
}
答案 1 :(得分:0)
所以对于名字的情况,我更喜欢并推荐第一个带嵌套的表格。
除了第二个更复杂的例子,第一个版本与我更喜欢的数组。在那种情况下,几个查询是可能的,否则就不会。考虑查询“找到所有存在客户联系的文件”677689“。第一种形式很简单:
db.collection_name.find({“clients.contact”:“677689”})
如果这是一个热门查询,你甚至可以索引:db.collection_name.ensureIndex({“clients.contact”:1})
(mongo shell脚本语法上面的代码;当然可以用任何语言做同样的事情,当然是正确的语法)