我想在MongoDB中进行一个有效的查询,以查找所有在用户组中列出用户ID的用户。理想情况下,我希望将此作为对MongoDB的单个请求。
我想要的对应于SQL中的嵌套选择。
我在蒙古壳里试过:
db.user.save({_id:"u1", Name:"u1 name"});
db.user.save({_id:"u2", Name:"u1 name"});
db.user.save({_id:"u3", Name:"u3 name"});
db.usergroup.save({_id:"g1", Users: ["u2","u3"]});
下面是我想要做的选择,但没有对[“u2”,“u3”]数组进行硬编码:
db.user.find({_id:{$in:["u2","u3"]}}).forEach(printjson);
这可以正常工作,并返回u2和u3的用户对象。
现在的问题是,如何在$in运算符中获取通过查询提取的用户ID数组,这样整个查询就可以用单个请求进行。
这样的“嵌套查询”不起作用:
db.user.find({_id:{$in:db.usergroup.find({_id:"g1"},{_id:0,Users:1})}}).forEach(printjson);
出现此错误:
3月27日星期二06:17:41未捕获异常:错误:“$err”:“无效查询”,“代码”:12580
加载失败:mongonestedselect.js
1)这在MongoDB中是否可行,如何实现?
2)如何使用正式的C司机?
最佳答案
在MongoDB中,这些问题的答案通常是取消数据的规格化。如果您只需要组中用户的列表,可以将用户ID和用户名存储在组文档中。在某些方面,您可以根据希望在屏幕上看到的结果来构造数据库,而不是将其设置为某种规范化格式。
显然,只有当您的用户组列表(带有名称)可以放在单个文档中时,这才有效,但是您当前的方法对于组的最大大小也有一些限制。
另一种方法是将用户所属的组存储在每个“用户”文档的数组中。在该数组字段上添加索引,现在可以按组查找用户。考虑到用户所属的组可能少于组中的成员,这可能是最好的方法。
db.user.save({_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]});
同样,您可以将组名与其ID一起存储,这样您就可以立即显示用户在一次往返行程中所属组的列表。当然,如果您允许更改组名,则必须启动后台任务来修复所有这些名称副本。
我也会使用内置的MongoDB ID生成器,而不是您自己的,它有许多理想的属性。