我正在努力实现以下目标:
选择我拥有的所有记录,其中所有权是我创建的对象或我管理的用户创建的对象,其中用户管理可以在管理用户的用户层次结构中
所有权显然很简单,可以通过与所有者相对应的简单 ID 来处理。用户管理的层次结构让我有点难以执行,而无需通过大量 ID 列表进行繁重的工作(显然,您可以找到受管理的每个用户,并使用 IN 子句或类似的子句列出这些用户中的任何一个创建的每个对象)。
理想情况下,这一切都发生在单个查询中,以便可以发生正常的分页和条件。
我在想可能需要一些数学来完成它——拥有可以以某种方式进行散列的 ID,以确定它们是否属于指挥链中的任何人所拥有。
对于此类事情有什么参考吗?
我错过了一些明显的事情吗?
如果能有所作为的话,可以使用 MongoDB,但也很乐意考虑其他数据库来获取灵感。
UPDATE:创建了一个包含 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}
Results:
# 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 的列表,性能也相当快。