【发布时间】:2020-09-07 07:27:55
【问题描述】:
我有这样的文件:
{
"id": "xxxxxxxxxxxx",
"groupsAuthorized": [
"USA/California/SF",
"France/IDF/Paris"
]
}
我有一个用户拥有授权组列表,例如:
"groups": [
"France/IDF",
"USA/NY/NYC"
]
我想要实现的是检索数据库中用户有权检索的所有文档,基本上我希望能够检查列表“groupsAuthorized”,如果其中一个组包含一个子集我的用户授权中包含的其他列表“组”的元素
使用以下值:
my document:
{
"id": "xxxxxxxxxxxx",
"groupsAuthorized": [
"USA/California/SF",
"France/IDF/Paris"
]
}
my user permissions:
"groups": [
"France/IDF",
"USA/NY/NYC"
]
用户应该能够检索此文档,因为字符串“France/IDF”正确包含在字符串“France/IDF/Paris”中,但是,如果值是这样的:
my document:
{
"id": "xxxxxxxxxxxx",
"groupsAuthorized": [
"USA/California/SF",
"France/IDF"
]
}
my user permissions:
"groups": [
"France/IDF/Paris",
"USA/NY/NYC"
]
它应该不起作用,因为我的用户仅被授权查看来自法国/IDF/Paris 和 USA/NY/NYC 的文档,并且我的文档的 authorizedGroups 中的字符串都不包含这些序列
我尝试使用标准 LINQ 查询来实现这一点,这相当简单:
var userAuthorizedGroups = new List<string> { "France/IDF/Paris", "USA/NY/NYC" };
var results = collection.AsQueryable()
.Where(entity => userAuthorizedGroups
.Any(userGroup => entity.authorizedGroups
.Any(entityAuthorizedGroup => entityAuthorizedGroup.Contains(userGroup))));
但我得到了著名的不受支持的过滤器异常,似乎很多人都有,我尝试了在互联网上找到的不同选项,如下所示:
var userAuthorizedGroups = new List<string> { "France/IDF/Paris", "USA/NY/NYC" };
var filter = Builders<PartitionedEntity<Passport>>.Filter.AnyIn(i => i.authorizedGroups, userAuthorizedGroups);
var results = (await collection.FindAsync(filter)).ToList();
return results;
但问题是这只会检查数组的一个元素是否包含在另一个数组中,对于应该正确匹配“France/IDF/Paris”的“France/IDF”这样的情况,它将无法正常工作因为“France/IDF”字符串包含在我文档中的“France/IDF/Paris”字符串中
我对如何使用 mongodb C# 驱动程序实现这一点有点一头雾水,我开始认为我应该将所有文档拉到客户端并手动进行过滤,但这会很混乱
有人对这个主题有什么想法吗?
【问题讨论】:
-
检查 this 以获取使用 mongo 运行复杂查询的替代方法
标签: c# .net mongodb mongodb-query mongodb-.net-driver