我对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 Driver和Linq查询具有匹配角色的用户的名字和姓氏。
听起来可能很有趣,但我尝试了如下尝试
public List<User> GetCaseAssigneesByRoles(string roles)
{
return User.Query.Find(User.Query.EQ(a=>a.FirstName, roles)).ToList();
}
答案 0 :(得分:3)
您应该可以这样查询用户:
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();
}
答案 1 :(得分:2)
这是使用MongoDB.Entities库使用LINQ的一种简单方法[免责声明:我是作者]
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
}
}])