Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 查询具有包含一组值的任何字段的文档_Mongodb - Fatal编程技术网

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

Mongodb 查询具有包含一组值的任何字段的文档,mongodb,Mongodb,我的收藏中的文档如下所示: { 'one':['a', 'b', 'c'], 'two':['d', 'e'], 'three':['f', 'g', 'h', 'i'], ... 'twelve': ['x', 'y', 'z'] } 文档中有12个这样的字段('1'、'2'、'3'…),有110个值('a'、'b'、'c'…)将作为数组元素随机分配给这些字段,但一个值只分配一次 如果某个字段(任何字段)的值是一个数组,其中包含“b”、“e”、“f”(所有字段,顺序都不重

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

{
  'one':['a', 'b', 'c'],
  'two':['d', 'e'],
  'three':['f', 'g', 'h', 'i'],
  ...
  'twelve': ['x', 'y', 'z']
}
文档中有12个这样的字段('1'、'2'、'3'…),有110个值('a'、'b'、'c'…)将作为数组元素随机分配给这些字段,但一个值只分配一次

如果某个字段(任何字段)的值是一个数组,其中包含“b”、“e”、“f”(所有字段,顺序都不重要)作为其元素(它可能包含其他元素),那么如何查找文档。匹配的文档可能如下所示:

{
  'one':['a', 'c'],
  'two':['b', 'x', 'f', 'e'],
  'three':['z', 'h', 'g']
  ...
}
此文档匹配,因为它有一个包含所有“b”、“e”、“f”的字段(“2”)

请注意,“b”、“e”、“f”只是搜索参数的一个示例。它也可以是‘h’、‘g’或‘k’、‘l’、‘s’、‘b’。但搜索参数的最大数目不应超过5个


如何编写查询或映射reduce函数以这种方式查找文档?或者我应该如何重构文档模型以使这种搜索成为可能?我甚至愿意接受关于其他数据库(sql或基于文档的数据库或任何其他类型的数据库)的建议,这些建议可能有助于此类搜索。

您可以尝试如下方式进行重组:

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

此外,您还可以通过属性名称查找并执行所有其他操作,这些操作都可以通过旧方案执行。

我喜欢重组的想法,但您需要在
查找
查询中使用
$elemMatch
,或者
$all
将应用于所有
属性
元素,而不是单独应用于每个元素。如果没有这一点,
$all:['a','d']
也会匹配。