【问题标题】:RavenDB query NOT containsRavenDB 查询不包含
【发布时间】:2011-12-11 17:56:46
【问题描述】:

我有文档用户的集合

User
{
  "Status": "ACTIVE",
  "Login": {
    "UserName": "login",
    "Password": null,
    "CreationDate": "2011-12-07T11:30:24.4062500Z",
    "Roles": [
      {
        "Id": "roles/WebUser",
        "Name": "WebUser"
      },
      {
        "Id": "roles/Admin",
        "Name": "Admin"
      }
    ]
  },
}

如何进行查询以获取角色名称为“WebUser”的用户列表,但角色名称为“Admin”的用户除外(包含角色“WebUser”但不包含角色“Admin”)

使用 LINQ 或 lucene

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    您需要为此创建一个索引,例如:

    from user in docs.Users
    select new { Roles = user.Logins.Roles.Select(x=>x.Name) }
    

    然后你可以查询正在使用:

    Roles:WebMaster AND -Roles:Admin
    

    【讨论】:

    • 谢谢。它只需稍作调整即可工作:从 docs.Users 中的 doc 选择 new { RoleName = ((IEnumerable)doc.Login.Roles).Select(x=>x.Name)
    • 不确定这种语法是否过时,但- 对我不起作用。我最终不得不使用NOT Prop:Value,但仅此一项并不能解决问题,我必须添加hack *:* AND NOT Prop:Value,我确信这会带来一些性能下降。我错过了什么吗?
    • @VinneyKelly,我的观察是field:bla AND (NOT Prop:Value) 有效,而field:bla AND (-Prop:Value) 无效。看起来像处理括号的错误。不幸的是,.Not 方法被转移到- 而不是NOT。在 v3.5 上测试
    【解决方案2】:

    这是你想要的吗?

    var users = documentSession.Query<User>()
        .Where(x => x.Login.Roles.Any(y => y.Name == "WebUser"))
        .Where(x => x.Login.Roles.Any(y => y.Name != "Admin"))
        .ToList();
    

    样本单元测试....

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using NUnit.Framework;
    using Raven.Client;
    using Raven.Client.Embedded;
    using Raven.Client.Linq;
    
    namespace Foo.Tests.
    {
        public class UserTests
        {
            [Test]
            // ReSharper disable InconsistentNaming
            public void GivenSomeUsersWithWebUserAndAdminRoles_Query_ReturnsSomeUsers()
            // ReSharper restore InconsistentNaming
            {
                IDocumentStore documentStore;
                using (documentStore = new EmbeddableDocumentStore {RunInMemory = true})
                {
                    // Arrange.
                    documentStore.Initialize();
    
                    // Create and store Fake Data.
                    using (IDocumentSession documentSession = documentStore.OpenSession())
                    {
                        IEnumerable<User> users = CreateFakeUsers(documentSession);
                        foreach (var user in users)
                        {
                            documentSession.Store(user);
                        }
                        documentSession.SaveChanges();
                    }
    
                    using (IDocumentSession documentSession = documentStore.OpenSession())
                    {
                        // Act.
                        var users = documentSession.Query<User>()
                            .Where(x => x.Login.Roles.Any(y => y.Name == "WebUser"))
                            .Where(x => x.Login.Roles.Any(y => y.Name != "Admin"))
                            .ToList();
    
                        // Assert.
                        Assert.IsNotNull(users);
                        Assert.AreEqual(2, users.Count);
                    }
                }
            }
    
            private IEnumerable<User> CreateFakeUsers(IDocumentSession documentSession)
            {
                return new List<User>
                           {
                               new User
                                   {
                                       Status = "ACTIVE",
                                       Login = new Login
                                                   {
                                                       UserName = "loging",
                                                       Password = null,
                                                       CreationDate = DateTime.UtcNow,
                                                       Roles = new List<Role>
                                                                   {
                                                                       new Role
                                                                           {
                                                                               Id = "roles/WebUser",
                                                                               Name = "WebUser"
                                                                           },
                                                                       new Role
                                                                           {
                                                                               Id = "roles/Admin",
                                                                               Name = "Admin"
                                                                           }
                                                                   }
                                                   }
                                   },
                               new User
                                   {
                                       Status = "ACTIVE",
                                       Login = new Login
                                                   {
                                                       UserName = "User 2",
                                                       Password = null,
                                                       CreationDate = DateTime.UtcNow,
                                                       Roles = new List<Role>
                                                                   {
                                                                       new Role
                                                                           {
                                                                               Id = "roles/WebUser",
                                                                               Name = "WebUser"
                                                                           }
                                                                   }
                                                   }
                                   },
                               new User
                                   {
                                       Status = "INACTIVE",
                                       Login = new Login
                                                   {
                                                       UserName = "User 3",
                                                       Password = null,
                                                       CreationDate = DateTime.UtcNow,
                                                       Roles = new List<Role>
                                                                   {
                                                                       new Role
                                                                           {
                                                                               Id = "roles/Admin",
                                                                               Name = "Admin"
                                                                           }
                                                                   }
                                                   }
                                   }
                           };
            }
    
            #region Nested type: Login
    
            private class Login
            {
                public string UserName { get; set; }
                public string Password { get; set; }
                public DateTime CreationDate { get; set; }
                public ICollection<Role> Roles { get; set; }
            }
    
            #endregion
    
            #region Nested type: Role
    
            private class Role
            {
                public string Id { get; set; }
                public string Name { get; set; }
            }
    
            #endregion
    
            #region Nested type: User
    
            private class User
            {
                public string Id { get; set; }
                public string Status { get; set; }
                public Login Login { get; set; }
            }
    
            #endregion
        }
    }
    

    【讨论】:

    • 没有。我想要的是角色“WebUser”但不是角色“Admin”(不包含角色“Admin”)的用户。在您的示例中,它只是第二个用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多