我使用自动架构来定义数组字段。我需要找到该数组中包含多个特定值的文档。我知道我可以使用$in:
运算符,而$in:
只能匹配第一个数组中的一个值与第二个数组中的任何一个,而我需要匹配第一个数组中具有所有值的任何记录。我怎么能做到这一点?
架构定义
Demands = new Mongo.Collection("demands");
var demandschema = new SimpleSchema({
ability: {type:array},
language: {type: array}});
Demands.attachSchema(demandschema);
目录定义
DemandsSet=[
{ability: ["laser eye", "rocky skin", "fly"], language: ["english", "latin", "hindu"]},
{ability: ["sky-high jump", "rocky skin", "fly"], language: ["english", "latin", "japanese"]},
{ability: ["rocky skin", "sky-high jump"], language: ["english", "latin", "russian"]}
];
目标集
var TargetAbility = ["rocky skin", "fly"];
var TargetLanguage = ["english", "hindu"];
当我执行$in
操作
Demands.find({ $and: [
{ ability: { $in: TargetAbility }},
{ language: { $in: TargetLanguage }}
]}).fetch();
我将返回所有记录,但不正确,我该如何执行这样的查找操作?
答案 0 :(得分:2)
$in:
不适合您,因为它在比较两个数组时会查找任何匹配,而不是所有元素必须存在在另一个。
您可以编写完整的javascript函数来执行mongodb查询中所需的比较。见$where:
例如:
Demands.find({$where:
"this.ability.indexOf(TargetAbility[0]) > -1 &&
this.ability.indexOf(TargetAbility[1]) > -1 &&
this.language.indexOf(TargetLanguage[0]) > -1 &&
this.language.indexOf(TargetLanguage[1]) > -1" });
如果您的候选人每人不超过2个参赛作品,那么您当然可以写一个更为一般的形式。
请注意,Meteor显然是$where:
的{{3}},但该限制可能会过时。
另请注意,$where:
无法利用索引,因此性能可能不适合大型集合。