Meteor.find数组中的多个值

时间:2015-09-26 04:40:47

标签: meteor mongodb-query

我使用自动架构来定义数组字段。我需要找到该数组中包含多个特定值的文档。我知道我可以使用$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();

我将返回所有记录,但不正确,我该如何执行这样的查找操作?

1 个答案:

答案 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:无法利用索引,因此性能可能不适合大型集合。