meteor比较集合中的embedded式数组

我有三个集合:

UserCollectionDepartmentCollectionQuestionsCollection

QuestionsCollection是一个可configuration的问题列表。

用户和部门各自回答从QuestionsCollection生成的调查,结果每个都有embedded的questionAnswer对象数组,每个对象都有一个questionid和一个answer属性。

UserCollection中的用户文档示例如下:

{ id:SoEtnNvN8B3QYcd3N, questionAnswers:[ { questionId: 1, answer: "melbourne" }, { questionId: 2, answer: "10"}] } } 

部门将具有相同的embedded式数组,但可以包含更多或更less的questionAnswer对象。 当然有不同的或相同的答案。

问题:

我想要做的是能够得到一个单一的用户questionAnswers数组作为search条件,并看看有多less部门匹配这些questionAnswers。

匹配将在两个属性上匹配,并且用户必须回答部门已经回答的相同问题以匹配例如

  • 如果部门回答了比用户更多的问题,那么它自动不会匹配。
  • 如果用户和部门回答相同数量的问题,则所有questionAnswer值应匹配。
  • 如果用户回答了比部门更多的问题,则所有的部门questionAnswers必须包含在用户questionAnswers内。

答案是完全匹配,但我可能需要某种机制来进行范围search。

我已经看了可能build立一个使用用户questionAnswers数组查询和使用$ elemMatchsearchDepartmentCollection,但我不知道如何实现这一点。 任何帮助或方向将不胜感激。

在这种情况下,您将不得不根据来自正在处理的当前用户的数据在代码中“构build”查询。

为了根据您的标准进行匹配,必须使查询匹配多个条件的逻辑。 来自用户数据的数组格式是有用的,但并不完全适合实际需要的查询部分。 所以它需要一些转换,并从您的示例数据工作,你会形成这样的:

 // Actually found by querying for the required user var user = { "id": "SoEtnNvN8B3QYcd3N", "questionAnswers":[ { "questionId": 1, "answer": "melbourne" }, { "questionId": 2, "answer": "10" } ] }; // Basic query var query = { "$or": [ { "$and": [ ] }, { "questionAnswers": { "$size": 1 }, "$or": [] } ] }; // add the elements user.questionAnswers.forEach(function(answer) { query.$or[0].$and.push({ "questionAnswers": { "$elemMatch" : answer }}); query.$or[1].$or.push({"questionAnswers": { "$elemMatch": answer }}); }); Department.find(query); 

在您的“用户”的数据查询将像这样构造:

 { "$or" : [ { "$and" : [ { "questionAnswers" : { "$elemMatch" : { "questionId" : 1, "answer" : "melbourne" }} }, { "questionAnswers" : { "$elemMatch" : { "questionId" : 2, "answer" : "10" }} } ] }, { "questionAnswers" : { "$size" : 1 }, "$or" : [ { "questionAnswers" : { "$elemMatch" : { "questionId" : 1, "answer" : "melbourne" }} }, { "questionAnswers" : { "$eleMatch" : { "questionId" : 2, "answer" : "10" }} } ] } ] } 

整个陈述由$or您的每个条件包装。 在第一个文件必须“全部匹配” $and语句中设置的条件,这是一个查询条件数组。

在第二个元素的顶部$or本质上是一个$and条件(以自然隐式的方式,因为键不会碰撞),首先根据你的规则考虑数组的$size ,所以只有一个元素的数组。 配对条件在另一个$or查看该单个元素是否匹配从用户提供的“questionAnswers”派生的条件的“任何”。 因此,单个元素匹配任何一个用户元素,然后匹配。

最后, $elemMatch为devise提供了一些灵活性,以便目标数组文档可以包含比源数据更多的属性,甚至属性键的顺序也不相同。 如果没有这个操作符,数组的子文档将被要求是源的“完全匹配”。