MongoDB выбирает записи, которые соответствуют значению в массиве - PullRequest
1 голос
/ 13 июня 2019

Я действительно очень плохо знаком с MongoDb, у меня есть два документа Mongodb: Роль и Пользователь

РОЛЬ

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

, и мой другой документ - Пользователь с приведенным ниже определениеми пользователь может иметь несколько ролей.

USER

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

Как я могу запросить firstName и lastName пользователя с совпадающими ролями, используя MongoDB .Net Driver и Linq.

Может звучит смешно, но я попробовал немного, как показано ниже

public List<User> GetCaseAssigneesByRoles(string roles)
        {

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

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

Вы должны иметь возможность запрашивать пользователей следующим образом:

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();
}
2 голосов
/ 13 июня 2019

вот простой способ сделать это с помощью LINQ, используя библиотеку MongoDB.Entities [заявление об отказе: я автор]

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

namespace StackOverflow
{
    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
    }
}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...