我的收藏中的文档如下所示:
{
'one':['a', 'b', 'c'],
'two':['d', 'e'],
'three':['f', 'g', 'h', 'i'],
...
'twelve': ['x', 'y', 'z']
}
文档中有12个这样的字段('one','two','three'..),有110个值('a','b','c'...)将会被随机分配为这些字段的数组元素,但只会赋值为ONCE。
如何查找字段值 - ANY字段 - 包含'b','e','f'(所有这些,并且顺序无关紧要)的数组作为其元素的文档(它可能包含其他元素)。匹配的文档可能如下所示:
{
'one':['a', 'c'],
'two':['b', 'x', 'f', 'e'],
'three':['z', 'h', 'g']
...
}
此文档匹配,因为它有一个字段('two'),其中包含所有'b','e','f'。
请注意'b','e','f'只是搜索参数的一个示例。它也可能是'h','g'或'k','l','s','b'。但搜索参数的最大数量不应超过5个。
如何编写查询或map-reduce函数以这种方式查找文档?或者我应该如何重组文档模型以使这种搜索成为可能?我甚至愿意接受有关其他数据库(sql或基于文档或任何其他类型)的建议,这些数据库可能有助于此类搜索。
答案 0 :(得分:2)
您可以尝试像这样重组:
db.collection.insert({
properties: [
{ name: 'one', values: ['a', 'b', 'c']},
{ name: 'two', values: ['d', 'e']},
{ name: 'three', values: ['f', 'g', 'h', 'i']}
]
})
找到这个查询:
db.collection.find({"properties": { $elemMatch: { values: { $all: [ 'f', 'h' ] }}}})
此外,您可以使用此方案执行许多其他操作,例如查找文档,其中任何属性的值是数组包含任何元素:
db.collection.find({"properties": { $elemMatch: { values: { $in: [ 'f', 'h' ] }}}})
此外,您可以通过属性名称找到并执行所有其他操作,您可以使用旧方案。