我很难找到查询数据的正确方法。我现在可能对此问题太了解了,因为这是“难道这不容易吗?”之一。事情...
我要查询的集合的对象结构如下:
{
tags: [a, b, c],
...
}
请注意, a , b 和 c 是引用标记对象的ObjectId,它们依次如下:
{
category: "X",
descriptor: "Y"
}
现在,用户可以从每个类别中选择一个以上的标签。并且取决于查询部分应该以不同的方式处理。为了说明:
用户选择A-1
,A-2
和B-1
(使用符号category-descriptor
),这意味着他们要查找匹配的对象(A-1
或 A-2
)和 B-1
;表示tags
数组的可行内容是[A-1, B-1]
,[A-2, B-1]
或[A-1, A-2, B-1]
,仅此而已。 (编辑:仅查看查询的标签,[A-2, B-1, C-5]
也是有效的)
当前版本太严格,只能找到完全匹配的内容,但下面举一个例子:
{ tags:
{ '$all': [ 'A-1', 'B-1' ]}
}
我摆弄了几种方法,用$all
和$in
来组合相同类别标签的笛卡尔积和其他类别的笛卡尔积,但似乎遇到了障碍,目前正在质疑对象结构甚至允许我需要这种查询...
修改
再读几次后,显而易见的解决方案似乎是手动创建所有可行组合的列表,就像我在解释此问题时所做的那样(即[[A-1, B-1], [A-2, B-1], [A-1, A-2, B-1]
)。这似乎是不受欢迎的解决方案,因为类别的数量可能很大。