mongodb - 使用 MongoDB 有效地确定层次结构中记录的所有者

标签 mongodb database-design database-permissions database

我正在努力实现以下目标:

Select all the records that I own, where ownership is objects I have created OR objects a user I manage has created, where user management can be in a hierarchy of users managing users

所有权显然很简单,可以通过与所有者相对应的简单 ID 来处理。用户管理的层次结构让我有点难以通过大量的 ID 列表执行繁重的工作(显然,您可以找到每个被管理的用户,并使用 IN 子句或类似的方式列出这些用户中的任何一个创建的每个对象)。

理想情况下,这一切都发生在单个查询中,因此可以发生正常的分页和条件。

我在想,可能有一些数学来完成它 - 拥有可以以某种方式散列的 ID 以确定它们是否由命令链中的任何人拥有。

对这类事情有任何引用吗?

我是否漏掉了一些明显的东西?

如果有所不同,则使用 MongoDB,但很高兴考虑其他数据库以获取灵感。

更新: 已经创建了一个包含 1,000,000 条记录的 MongoDB 集合,以获取关于查询中 IN 子句的可管理参数数量的确切数据。当我有一些具体信息时会报告。

分析:

使用 ruby​​-mongo-driver 和 ruby​​ 基准库。

包含 1039944 条记录的 MongoDB 集合

记录定义为:

{
    first_name: String,
    last_name: String,
    email: String,
    phone: String,
    company: String,
    owner: BSON::ObjectId
 }

为所有字段随机生成值。

所有者字段有一个索引。

运行具有以下条件的查询:

conditions = {"owner" => { "$in" => id_list }}
opts = {skip: rand, limit: 100}

结果:

    # 10201 ids
    #              user     system      total        real
    # 0:       0.240000   0.000000   0.240000 (  0.265148)
    # 1:       0.240000   0.010000   0.250000 (  0.265757)
    # 2:       0.240000   0.000000   0.240000 (  0.267149)
    # 3:       0.240000   0.000000   0.240000 (  0.269981)
    # 4:       0.240000   0.000000   0.240000 (  0.270436)
    # Find:    0.240000   0.000000   0.240000 (  0.266709)


    # 5201 ids
    #              user     system      total        real
    # 0:       0.120000   0.000000   0.120000 (  0.133824)
    # 1:       0.120000   0.000000   0.120000 (  0.134787)
    # 2:       0.110000   0.000000   0.110000 (  0.133262)
    # 3:       0.110000   0.000000   0.110000 (  0.136046)
    # 4:       0.120000   0.000000   0.120000 (  0.141220)
    # Find:    0.130000   0.000000   0.130000 (  0.139110)

    # 201 ids
    #              user     system      total        real
    # 0:       0.010000   0.000000   0.010000 (  0.006044)
    # 1:       0.000000   0.000000   0.000000 (  0.004681)
    # 2:       0.010000   0.000000   0.010000 (  0.004578)
    # 3:       0.000000   0.000000   0.000000 (  0.007048)
    # 4:       0.010000   0.000000   0.010000 (  0.008487)
    # Find:    0.000000   0.000000   0.000000 (  0.005990)

    # 1 id (NOT using IN)
    #              user     system      total        real
    # 0:       0.000000   0.000000   0.000000 (  0.002868)
    # 1:       0.000000   0.000000   0.000000 (  0.004937)
    # 2:       0.010000   0.000000   0.010000 (  0.003151)
    # 3:       0.000000   0.000000   0.000000 (  0.002983)
    # 4:       0.000000   0.000000   0.000000 (  0.003313)
    # Find:    0.000000   0.000000   0.000000 (  0.002742)

即使在查询中有 10k 个 ID 的列表,性能也非常快。

最佳答案

如果您尝试根据“列”从 MongoDB 中“选择”记录,该“列”的值来自一组可能的值,您需要与用户管理表进行连接才能确定,那么 NoSQL 对您不利...

如果用户 ID 列表仍然易于管理,您可以执行 where ownerId in (?,?,?,?,?...) 类型的查询(在首先确定列表后):

db.documents.find({owner:{$in: [1234, 2345, 4444, 77777, 99999]}})

NoSQL 方法可能是非规范化,例如不仅在文档中包含 ownerId,还包含管理层次结构中的完整路径:

{  _id: 'the document A',
   owner : 1234,
   managers: [ 2345, 4444, 77777, 99999 ]
}

当然,当用户层次结构发生变化时,这将需要更新。

关于mongodb - 使用 MongoDB 有效地确定层次结构中记录的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8207614/

相关文章:

javascript - JavaScript 中的键值对

java - Project Reactor 条件执行

sql-server - 如何授予冒充任何其他用户的权限?

python - 自动合并任意 Django 模型

sql-server - SQL Server : permissions to read database diagrams for user that has 'read-only' access

java - Hibernate:有没有办法以编程方式创建类似于现有表的新表?

javascript - .insertOne 不是函数

node.js - 尝试删除 Mongoose 中的子文档会出现内部 mongoose 错误

database-design - 外键与完整性检查约束

php - 多用户平台收据序列号