2011-03-09 69 views
0

我想在mongodb中存储一个类似于哈希的值。我可以把许多密钥放在一个mongodb集合中

有两个收集,人员和工作。一个人有一些数量的作品。在其他馆藏中加入更多细节(也许参考其他馆藏)。

例如。人(吉姆)有一件作品(a)和三件作品(b)。

// Person 
{ 
    _id: "4d772583c186233352000001" 
    name: "Jim" 
    works: { 
     "4d772583c186233352000002": 1 
     "4d772583c186233352000003": 3 
     ... 
    } 
} 

// Work 
{ 
    _id: "4d772583c186233352000002" 
    title: "Make cake" 
    finished_at: ... 
} 
{ 
    _id: "4d772583c186233352000003" 
    title: "Make iPhone" 
    finished_at: ... 
} 
... 

如果我存储像上面这样的人的作品属性。人员关键路径将包括工作的ID并且一次又一次地增加。这是对的吗?

+0

在Rich-Web项目中。我们需要序列化从服务器到客户端的数据。第一个数据样式将变成字典。否则,我们必须处理一个数组和一些字典。 – colder

回答

1

我不完全相信我理解这里的实际问题。你是否要求对你的模式设计提出第二个意见?如果是这样,这是我的:

使用文档ID保持集合之间的关系绝对没有错,就像你所做的一样。有时候,这是正确的(也是唯一的)方法,即使你必须承担维护关系/参考的责任,因为你可能知道,mongoDB不会帮助你。

虽然,通过查看上面的示例模式来理解您的用例有点困难,但是捕捉我眼睛的是工作对象。

我想你会更好使用数组 - 也许是这样的:

works: [ 
     { "4d772583c186233352000002": 1 }, 
     { "4d772583c186233352000003": 3 } 
] 

这样,你将有来自蒙戈更好的支持在维护你的参考,使用例如$拉动和$推运营商。

但是,我想知道如何使用外部id参考作为工作参考对象中的关键。对于更多的惯用物体,请考虑:

works : [ 
    { work_id: "4d772583c186233352000002", quantity: 1 }, 
    { work_id: "4d772583c186233352000003", quantity: 3 } 
] 

这有帮助吗?

+0

我担心的关键是可变的。如果我有大量数据。 mongodb会减慢吗?我无法想象如何为他们建立索引。 – colder

+0

我不明白你的意思是关键是可变的。 很明显,你输入的数据越多,mongo就会越慢。但是在这之前你可以拥有大量的这些类型的文档,除非你有非常明确的性能要求。只要确保你的查询将使用你的索引。 关于索引,如果您的意思是您希望查询拥有对特定工作的引用的Person,则可以通过在“works.works_id”,“db.persons.ensureIndex”上添加索引来轻松完成此操作({“works.works_id”:1})' – svjson

相关问题