2012-02-23 74 views
0

如果我有一个集合:游客,我想嵌入到它访问数组,那么它会是这个样子:MongoDB的嵌入结构和搜索

 
Visitor1 
->Visit 1 
->Visit 2 

Visitor2 
->Visit 1 
->Visit 2 
  • 这是一个很好的结构?
  • 当我将有数百万的文档时,我将不得不先查找访问者然后添加访问,这种结构是否高效?
  • 如何显示所有访问者的所有访问?

回答

2

它可以是有效的,取决于你必须做更多的经常。结构本身就很好。当您查询访问者时,您总是可以为单个访问者提供“免费”的所有访问,因此您可以轻松访问单个访问者的所有访问。这也意味着你不需要访问集合来清理你的模式。

下面是示例实现你所需要的操作:

添加访问:

db.visitors.update({_id:<visitorId>}, {$push:{visits:<newVisit>}})

删除,请访问:

db.visitors.update({_id:<visitorId>}, {$pull:{visits:{visitId:<visitId>}})

如果您的意思是显示所有访客的所有访问,目前没有直接的方式。您可以使用独特的操作和一些应用程序逻辑来打开各个阵列或使用m/r。在2.2中。会有一个聚合框架可以做到这一点。

有一些事情要考虑,虽然:

  • 文件有16MB的限制。如果你有足够的访问次数来达到这个限制,那么你需要一个单独的访问收集。
  • 查询某个特定访问者的访问是不可能的。您总是查询顶级文档,因此如果用户有14,000次访问,并且只需要特定的一些文档,则必须检索整个文档。对于分页,可以使用$ slice进行处理。
  • 如果没有单独的访问收集,修改单个访问者对多次访问的更新可能会非常棘手。每个更新只能通过位置运算符$来寻址一个数组元素。

希望有帮助。