2

我如何完成以下任务?

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 但它们的工作方式不同。

4

2 回答 2

1

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

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 } } ); }


这绝对是一种解决方法!我不确定我是否缺少任何其他可以完成这项工作的操作员。

于 2012-07-27T20:57:42.390 回答
1

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

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

于 2012-07-30T22:03:31.650 回答