首页 > 解决方案 > MongoDB选择与数组中的值匹配的记录

问题描述

我对 MongoDb 真的很陌生,我有两个 Mongodb 文档 Role 和 User

角色

{"_id":"5d0124b858d49243306deaa2",   
"mdt":"2019-06-12T16:13:44.037Z",
"mby":"000000000000000000000000",
"IsDeleted":false,
"Name":"Manager"}

我的另一个文档是具有以下定义的用户,用户可以拥有多个角色。

用户

{ 
  "firstName" : "John",
  "lastName" : "Doe",
  "Role" : {"5d0124b858d49243306deaa2", "6d0125b858749243306deaa2", "9b0124a852d49245306deba2"} \\ Array of role Id's assigned to users
}

如何使用 MongoDB .Net 驱动程序和 Linq 查询具有匹配角色的用户的名字和姓氏。

可能听起来很有趣,但我很少尝试如下

public List<User> GetCaseAssigneesByRoles(string roles)
        {

            return User.Query.Find(User.Query.EQ(a=>a.FirstName, roles)).ToList();
        } 

标签: c#mongodblinqmongodb-querymongodb-.net-driver

解决方案


您应该能够像这样查询用户:

public List<User> GetCaseAssigneesByRoles(string role)
{
    return UserCollection
        .Find(Builders<User>.Filter.AnyEq(u => u.Roles, role))
        .ToEnumerable()
        .ToList();
}

本质上AnyEq接受一个数组 ( Roles) 并检查列表中的任何单个项目是否等于您指定的值。您可能需要更改此示例中的某些字段名称。

或者对于角色列表(单个角色必须匹配):

public List<User> GetCaseAssigneesByRoles(List<string> roles)
{
    return UserCollection
        .Find(Builders<User>.Filter.AnyIn(u => u.Roles, roles))
        .ToEnumerable()
        .ToList();
}

或者对于角色列表(所有角色必须匹配):

public List<User> GetCaseAssigneesByRoles(List<string> roles)
{
    return UserCollection
        .Find(Builders<User>.Filter.All(u => u.Roles, roles))
        .ToEnumerable()
        .ToList();
}

推荐阅读