2011-12-26 86 views
0

我有一个mongoDB集合,其中有一个数组字段,用于表示用户所属的列表。在MongoDB中返回自定义字段

user { 
    screen_name: string 
    listed_in: ['list1', 'list2', 'list3', ...] //Could be more than 10000 elements (I'm aware of the BSON 16MB limits) 
} 

我现在用的是* listed_in *场拿到成员列表

db.user.find({'listed_in': 'list2'}); 

我还需要查询特定的用户知道他是否是特定列表的成员

var user1 = db.findOne({'screen_name': 'user1'}); 

在这种情况下,我将获得其所有成员的* listed_in *字段。

我的问题是: 有没有办法预先计算mongoDB中的自定义字段? 我需要通过的* listed_in迭代*阵列知道,如果能够得到这样的领域,user1.isInList1user1.isInList2

现在我必须这样做,在客户端用户是“list1”的成员,但* listed_in *可能有一千个元素。

+1

当你说你想得到像'user1.isInList1'这样的结果时,这是否意味着你希望mongo为每个存在的列表在文档的根级设置一个布尔键?难道这不是很难预测吗?你能解释一下你想用最终结果对象完成的问题吗?此外,如果您打算快速创建该文档并为listed_in编制索引,我相信索引列表的默认5k元素限制。你可以通过 – jdi 2011-12-26 22:52:15

+0

来提高它在哪里可以找到更多关于索引列表的5k元素限制的信息?我以前没有听说过。 – aartiles 2011-12-27 07:48:11

+0

奇怪。我现在正在做我的第一个MongoDB项目,当我研究索引数组时,我发现信息表示索引数组有5k元素限制。现在,我再也找不到了。如果我是这样的话,我很高兴在这个问题上出错:-) – jdi 2011-12-27 17:03:13

回答

0

我的问题是:有没有办法预先计算mongoDB中的自定义字段?

不是。 MongoDB没有任何“计算列”的概念。所以你正在寻找的查询不存在。

现在我有过* listed_in迭代做到在客户端*知道数组,如果用户的“列表1”的成员,但* listed_in *可能有一千元素

在你的情况下,你基本上试图将客户端for循环拖到服务器上。但是,有些过程仍然需要执行for循环。坦率地说,循环10k项目对于客户端或服务器来说都不是那么重要。

这里唯一真正的节省是防止网络上的额外数据。

如果您确实想要保存该网络流量,则需要重新构建数据模型。这种重新结构可能会涉及两个查询来读写,但通过线路传输的数据较少。但这是一个折衷。

+0

是的,我关心的还是网络流量。你能否给我更多关于你的想法的细节来重新构建模型? – aartiles 2011-12-27 07:51:08

+0

你基本上只是像在SQL中一样建立一个“连接”表。所以你建立一个包含两个字段的集合:'screen_name'和'list',然后你在两个字段上索引。现在,您可以为'screen_name/list'执行索引查询,并且只返回最小数据集。权衡是你需要维护两个数据副本*或*你需要接受其中一个查询将是次优的。 – 2011-12-28 08:49:35

+0

每个列表最多可以有10M个成员。这是我第一个使用Mongo的项目,您认为MongoDB能够在超过10亿个文档的集合上正常工作吗? – aartiles 2011-12-28 10:00:48

相关问题