mongodb数组匹配

时间:2012-07-25 10:01:07

标签: mongodb mongodb-query

如何完成以下操作?

db.test.save( {a: [1,2,3]} );

db.test.find( {a: [1,2,3,4]} );  //must match because it contains all required values [1, 2, 3]
db.test.find( {a: [1,2]} );  //must NOT match because the required value 3 is missing

我知道$ in和$ all,但他们的工作方式不同。

2 个答案:

答案 0 :(得分:1)

有趣......问题是.. $ in和$或运算符应用于您正在比较集合中的每个文档的数组元素,而不是元素文档中的数组。总结一下您的问题:如果集合中的任何文档恰好是传递的数组的子集,那么您希望它是匹配的。除非你交换输入和输出,否则我想不出办法做到这一点。我的意思是......让我们接受你的第一个输入:

db.test.find( {a: [1,2,3,4]} );

考虑把它放在临时集合中,例如:temp:

db.temp.save( {a: [1,2,3,4]} );

现在遍历测试集合中的每个文档,并在temp中“找到”它,使用$ all运算符确保它完全被包含,即执行以下操作:

foreach(doc in test)
{ db.temp.find( { a: { $all: doc.a } } ); }


这绝对是一种解决方法!我不确定我是否缺少任何能够胜任此工作的其他操作员。

答案 1 :(得分:1)

目前没有运营商可以找到包含子集值的文档。有一个建议的改进来添加$ subset运算符。请随时在JIRA中对该问题进行投票: https://jira.mongodb.org/browse/SERVER-974

其他可能不适合您的用例的可能的解决方法可能涉及map reduce或新的聚合框架(在MongoDB 2.2版中可用): http://docs.mongodb.org/manual/reference/aggregation/#_S_project