我想在MongoDb中进行一次高效的查询,以查找在用户组中列出了其用户名的所有用户.理想情况下,我希望将此作为对Mongodb的单个请求.

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"]});

下面是我想做的 Select ,但不需要硬编码["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);

给出了以下错误:

1) 这在mongodb中可能吗?如何实现?

2) 如何使用官方的c#driver?

推荐答案

在MongoDB中,这些问题的答案通常是对数据进行非规范化.如果您只需要组中的用户列表,可以将用户Id and和用户名存储在组文档中.在某些方面,您可以根据希望在屏幕上看到的结果来构建数据库,而不是试图将其转换为某种规范化的格式.

显然,只有当你的用户组列表(带有名称)可以放在一个文档中时,这才有效,但是你目前的方法在组的最大大小方面也有一些限制.

另一种方法是将用户所属的组存储在每个"用户"文档的数组中.在该数组字段上添加索引,现在可以按组查找用户.考虑到用户所属的组可能少于组中的成员,这可能是最好的方法.

db.user.save({_id:"u1", name:"u1 name", groups:[{_id:"g1", name:"Group One"}, ...]});

同样,您可以将组名与其_id一起存储,这样就可以立即显示用户在一次往返中所属的组的列表.当然,如果你允许更改组名,你必须启动一个后台任务来修复名称的所有副本.

我也会使用内置的MongoDB id生成器,而不是您自己的,它有许多理想的特性.

Mongodb相关问答推荐

如何在MongoDB中查找和过滤嵌套数组

MongoDB$unionWith,如何 Select 特定文档

MongoDB - 将对象转换为数组

MongoDB 聚合 - $project 和 $match 阶段未按预期工作

DB 中的引用对象在 GraphQL 查询中返回 null

如何将交易列表变成 token 数量的对象?

如何将以下聚合查询转换为 bson 并在 golang 中执行

Mongoose $inc 枚举验证失败

如何在 Mongo 聚合中合并文档中的数组字段

Mongoose 与 mongodb 如何返回刚刚保存的对象?

如何使用 mongoexport 导出排序数据?

Golang/mgo:如何让 MongoDB 在字段中使用当前时间?

$elemMatch 的 MongoDB 索引

如何在mongoose中加入两个集合

在 MongoDB 中合并两个集合

'this' 在 Mongoose 预保存挂钩中未定义

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

MongoDb:聚合 $lookup 过滤外部文档

MongoDB打印两点之间的距离

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小