Javascript Meteor比较集合中的嵌入式阵列

Javascript Meteor比较集合中的嵌入式阵列,javascript,node.js,mongodb,meteor,mongodb-query,Javascript,Node.js,Mongodb,Meteor,Mongodb Query,我有三个收藏: 用户集合,部门集合和问题集合 问题集合是一个可配置的问题列表 每个用户和部门都回答由QuestionsCollection生成的调查,因此每个用户和部门都有一个内嵌的questionAnswer对象数组,每个对象都有一个questionid和一个answer属性 UserCollection中的用户文档示例如下: { id:SoEtnNvN8B3QYcd3N, questionAnswers:[

我有三个收藏:

用户集合部门集合问题集合

问题集合是一个可配置的问题列表

每个用户和部门都回答由QuestionsCollection生成的调查,因此每个用户和部门都有一个内嵌的questionAnswer对象数组,每个对象都有一个questionid和一个answer属性

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

        {
            id:SoEtnNvN8B3QYcd3N,
            questionAnswers:[
            {
               questionId: 1, 
               answer: "melbourne"
            }, 
            {
               questionId: 2,
               answer: "10"}]
            }
        }
一个部门将具有相同的嵌入式数组,但可以包含更多或更少的问答对象。当然有不同或相同的答案

问题:

我想做的是能够获得一个用户问答数组作为搜索条件,并查看有多少部门匹配这些问答

匹配将在两个属性上匹配,用户必须回答与部门回答相同的问题才能匹配,例如:

  • 如果部门回答的问题比用户回答的问题多,则该部门将自动不再是用户 匹配
  • 如果用户和部门回答了相同数量的问题,则所有问题答案值应匹配
  • 如果用户回答的问题多于部门,则所有部门的问题答案必须包含在用户问题答案中
答案将是完全匹配的,尽管我可能需要一种机制在某个时候进行范围搜索


我曾研究过使用users questionAnswers数组构建查询,并使用$elemMatch搜索DepartmentCollection,但我不确定如何实现这一点。如果您能提供任何帮助或指导,我们将不胜感激。

这是其中一种情况,您必须根据当前处理用户的数据以代码“构建”查询

为了根据您的条件进行匹配,必须进行查询以匹配多个条件的逻辑。用户数据中的数组形式很有用,但与实际需要的查询部分并不完全匹配。因此,它需要一些转换,从您的示例数据出发,您可以这样形成它:

//通过查询所需用户实际找到
变量用户={
“id”:“SoEtnNvN8B3QYcd3N”,
“问题答案”:[
{
“问题ID”:1,
回答:“墨尔本”
}, 
{
“问题ID”:2,
回答:“10”
}
]
};
//基本查询
变量查询={
“$or”:[
{“$and”:[]},
{ 
“问题答案”:{“$size”:1},
“$或”:[]
}
]
};
//添加元素
user.questionAnswers.forEach(函数(答案){
query.$或[0].$和.push({“questionAnswers”:{“$elemMatch”:answer}});
query.$或[1].$或.push({“questionAnswers”:{“$elemMatch”:answer}});
});
查找(查询);
在“用户”的数据上,查询的结构如下:

{
“$or”:[
{
“$and”:[
{
“问题答案”:{“$elemMatch”:{
“问题ID”:1,
回答:“墨尔本”
}}
},
{
“问题答案”:{“$elemMatch”:{
“问题ID”:2,
回答:“10”
}}
}
]
},
{
“问题答案”:{
“$size”:1
},
“$or”:[
{
“问题答案”:{“$elemMatch”:{
“问题ID”:1,
回答:“墨尔本”
}}
},
{
“问题答案”:{“$eleMatch”:{
“问题ID”:2,
回答:“10”
}}
}
]
}
]
}
对于您的每个条件,整个语句都由包装。在第一种情况下,文档必须“全部匹配”语句中设置的条件,这是一个查询条件数组

在顶部的第二个元素中,
$或
基本上是一个
$和
条件(以自然隐式方式,因为键不会碰撞),它首先根据规则考虑数组的大小,因此只考虑具有单个元素的数组。配对条件位于另一个
$或
中,以查看单个元素是否与从用户提供的“问题答案”派生的条件中的“任何”匹配。因此,如果单个元素与任何一个用户元素匹配,那么它就是一个匹配


最后,对于目标数组文档可能包含比源数据中更多的属性,甚至属性键的顺序不相同的情况,在设计中为您提供了一些灵活性。如果没有该运算符,数组的子文档将需要与源文件“完全匹配”。

感谢您的全面回复。我想我就快到了,尽管我在第一篇文章中更新了条件,因为我觉得我不够清楚。我现在的问题是第三点,用户回答的问题比部门多,部门问答数组必须包含在用户问答数组中。我是否需要在我的UserCollection中查找特殊情况?