查询嵌入文档
问题描述:
我要创建一个模式是这样的:查询嵌入文档
[
{
username: "fabio",
password: "xxx",
roles: [
{
rolename: "administrator",
isVip: true
},
{
rolename: "manager",
isVip: true
}
]
},
{
username: "marco",
password: "yyy",
roles: [
{
rolename: "manager",
isVip: true
}
]
},
{
username: "pippo",
password: "...",
roles: [
{
rolename: "monkey",
isVip: false
}
]
}
]
现在我想列出所有可用的角色,在我的应用程序,从用户收集开始。
我想到一个SELECT DISTINCT rolename FROM ...
SQL语句。
我想要得到类似{"administrator","manager","monkey"}
的结果。
- 这可能吗?
-
我可以执行什么查询?我想了一下:
db.users.find({“roles.rolename”:{$ exists:true}});
但是,这会找到所有的用户,而不是所有的角色。
它好吗?或者更好地创建另一个集合“角色”并保留一组ObjectIds?
我正在使用Mongoose(mongodb for nodejs),所以我的查询必须为此做好准备。
答
可以使用distinct()命令查找唯一值:
> db.users.distinct('roles.rolename')
[ "administrator", "manager", "monkey" ]
其高效与数十亿的文件用户和角色的? http://*.com/questions/12139334/how-to-query-all-subdocuments –
如果你有*数十亿的用户和角色,你会以不同的方式处理你的数据模型。最好的情况是,distinct将扫描作为查询标准提供的所有文档的索引。如果索引适合内存,这可能很好。如果你没有索引,不同的将不得不扫描匹配的文件)。这取决于您实际需要多长时间才能找到不同的角色,但您也可以限制查询(例如,按日期查找新角色)。另一种数据模型是将不同的角色名称保存在他们自己的集合中(可能由角色名称或同一个唯一索引键入)。 – Stennie