1

让我以一种非常简单的方式问我的问题。这个:

{
    "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
            }
        }
    ]
}

对比

{
    "company": "Amc",
    "10Gen": {
        "123": 1200,
        "contact": "01002033"
    },
    "Sun": {
        "23": 34000,
        "contact": "677689"
    }
}

由于应用层负责大多数操作,第二种方法不是更合适吗?

为了更好地构造数据,嵌套数据是不好的做法吗?说5个嵌套文档?

我错过了一个非常明显的事实吗?

4

2 回答 2

3

仅供参考:

考虑一个非常大的文档。考虑下面的示例(我为文档放置了少量密钥)。并考虑以下两个更新。

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
    }
}
于 2013-05-07T07:30:32.390 回答
0

所以对于名称案例,我更喜欢并推荐第一种嵌套形式。

除了第二个涉及更多的例子之外,我更喜欢带有数组的第一个版本。在那种情况下,可能会有几个查询,否则不会。考虑查询“为我找到所有存在联系人“677689”的客户的文档。第一种简单的形式:

db.collection_name.find({“clients.contact”:“677689”})

如果这是一个热门查询,您甚至可以对此进行索引:

db.collection_name.ensureIndex( { "clients.contact" : 1 } )

(上面的代码在 mongo shell 脚本语法中;当然可以用任何语言用正确的语法做同样的事情)

于 2013-05-07T22:56:46.950 回答