我正在努力实现以下目标:
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/