C#MongoDB驱动程序:在MongoDB中找不到对AnyIn筛选器运行复杂查询的方法

问题描述 投票:1回答:1

我有这样的文件:

{
  "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 / Paris”中正确包含了字符串“ France / IDF”,因此用户应该能够检索此文档,但是,如果值将像这样:

my document:
{
  "id": "xxxxxxxxxxxx",
  "groupsAuthorized": [
    "USA/California/SF",
    "France/IDF"
  ]
}

my user permissions:
"groups": [
  "France/IDF/Paris",
  "USA/NY/NYC"
]

它不起作用,因为我的用户仅被授权查看来自France / 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”之类的情况应该正确匹配“ France / IDF / Paris”,它将无法正常工作,因为我的文档中的“法国/ IDF /巴黎”字符串中包含“法国/ IDF”字符串

我对如何使用mongodb C#驱动程序实现这一点一无所知,我开始认为我应该将所有文档拉到客户端并手动进行过滤,但这会很麻烦。]

有人对此主题有想法吗?

我有一个这样的文档:{“ id”:“ xxxxxxxxxxxx”,“ groupsAuthorized”:[“ USA / California / SF”,“ France / IDF / Paris”]}我有一个用户具有以下列表授权团体,例如...

c# .net mongodb mongodb-query mongodb-.net-driver
1个回答
0
投票

我开始认为我应该将所有文档拉到客户端并手动进行过滤,但这会很麻烦

© www.soinside.com 2019 - 2024. All rights reserved.