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']
也会匹配。