如何完成以下操作?
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,但他们的工作方式不同。
答案 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