在MongoDB中返回自定义字段

在MongoDB中返回自定义字段,mongodb,schema-design,nosql,Mongodb,Schema Design,Nosql,我有一个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'}); 我还需要

我有一个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'});
在本例中,我将获得包含所有成员的*列出的\ u In*字段

我的问题是: 有没有办法在mongoDB中预先计算自定义字段? 我需要能够得到像这样的字段,user1.isInList1,user1.isInList2

现在,我必须在客户端通过遍历*listed_in*数组来了解用户是否是list1的成员,但是*listed_in*可能有1000个元素

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

不是真的。MongoDB没有任何计算列的概念。因此,您要查找的查询不存在

现在,我必须在客户端通过遍历*listed_in*数组来了解用户是否是list1的成员,但是*listed_in*可能有1000个元素

在您的例子中,您基本上是尝试将客户端for循环推送到服务器上。但是,某些进程仍然必须执行for循环。坦率地说,对于客户机或服务器来说,循环处理10k个项目并没有那么多工作

这里唯一真正的节约是防止网络上出现额外数据


如果你真的想保存网络流量,你需要重新构造你的数据模型。这种重新结构可能涉及两个要读写的查询,但通过网络传输的数据较少。但这是一个折衷办法。

当您说希望得到像:user1.isInList1这样的结果时,是否意味着您希望mongo在文档的根级别为存在的每个列表设置一个布尔键?这不是很难预测吗?你能进一步解释一下你想用最终结果对象解决的问题吗?此外,如果您计划使该文档快速并为中列出的元素编制索引,我相信索引列表有一个默认的5k元素限制。你可以在哪里找到更多关于索引列表5k元素限制的信息?我以前没听说过。奇怪。我现在正在做我的第一个MongoDB项目,当我研究索引数组时,我发现有信息说索引数组有5k个元素的限制。现在,我再也找不到了。如果我错了,我很高兴:-是的,我也担心网络流量。你能告诉我更多关于你重新构造模型的想法吗?你基本上只需要像在SQL中那样构建一个连接表。因此,您构建了一个包含两个字段的集合:screen_name和list,然后在这两个字段上建立索引。现在您可以对screen_name/list进行索引查询,只返回最小的数据集。取舍是您需要维护数据的两个副本,或者您需要接受其中一个查询将是次优的。每个列表最多可以有1000万个成员。这是我第一个使用Mongo的项目,你认为MongoDB能在一个拥有超过10亿文档的集合上正常工作吗?另外,如果我使用联接表,我需要对用户集合~2亿docs'db.user.find{u id:{'$in':[id1,id2…,id10M]}进行这种查询,不确定这个查询需要多长时间。这就是为什么我试图获取用户集合中的所有内容。MongoDB可以处理数十亿个文档,但拥有数百万成员的列表不太可能工作。单个MongoDB文档的大小限制为16MB。因此,文档中的1000万项数组将打破这一限制。您可能需要将其建模为三个集合,并编写一组手动联接。