查询包含任何包含一组值的字段的文档

时间:2014-03-01 15:38:48

标签: mongodb

我的收藏中的文档如下所示:

{
  '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或基于文档或任何其他类型)的建议,这些数据库可能有助于此类搜索。

1 个答案:

答案 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' ] }}}})  

此外,您可以通过属性名称找到并执行所有其他操作,您可以使用旧方案。