MongoDB 选择与数组中的值匹配的记录

MongoDB selecting records which match value in array

我对 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();
        } 

您应该可以像这样查询用户:

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();
}

这是使用库 MongoDB.Entities 使用 LINQ 完成此操作的简单方法 [免责声明:我是作者]

using MongoDB.Entities;
using MongoDB.Driver.Linq;
using System.Linq;

namespace Whosebug
{
    public class Program
    {
        public class User : Entity
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string[] Roles { get; set; }
        }

        public class Role : Entity
        {
            public string Name { get; set; }
        }

        static void Main(string[] args)
        {
            new DB("test");

            var managerRole = new Role { Name = "Manager" };
            var superRole = new Role { Name = "Supervisor" };

            managerRole.Save();
            superRole.Save();

            var user = new User
            {
                FirstName = "John",
                LastName = "Doe",
                Roles = new[] { managerRole.ID, superRole.ID }
            };

            user.Save();

            var findRoles = new[] { managerRole.ID, superRole.ID };

            var managers = DB.Queryable<User>()
                             .Where(u => u.Roles.Any(r => findRoles.Contains(r)))
                             .Select(u => u.FirstName + " " + u.LastName)
                             .ToArray();
        }
    }
}

这是它发送给 mongodb 的聚合查询:

db.User.aggregate([{
    "$match": {
        "Roles": {
            "$elemMatch": {
                "$in": ["5d02691bada517167415c326", "5d02691cada517167415c327"]
            }
        }
    }
}, {
    "$project": {
        "__fld0": {
            "$concat": ["$FirstName", " ", "$LastName"]
        },
        "_id": 0
    }
}])