Javascript MongoDB查询:如何查找嵌套对象中的字符串

Javascript MongoDB查询:如何查找嵌套对象中的字符串,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我有一个带有考勤字段的课程模式,它存储一个具有以下键值结构(string:List)的字典。特别是,Attention对象的键存储班级的日期,而值存储出席的学生列表(学生ID) 例如,单个课程项目可以如下所示: {"_id":"559a7353186a384b54f9aea9","attendance":{"2015-12-17":["558febdb949eff4711e621e9","559020fe79f141941ddd3246"],"2015-11-14":["558febdb949e

我有一个带有考勤字段的课程模式,它存储一个具有以下键值结构(string:List)的字典。特别是,Attention对象的键存储班级的日期,而值存储出席的学生列表(学生ID)

例如,单个课程项目可以如下所示:

{"_id":"559a7353186a384b54f9aea9","attendance":{"2015-12-17":["558febdb949eff4711e621e9","559020fe79f141941ddd3246"],"2015-11-14":["558febdb949eff4711e621e9","559020fe79f141941ddd3246"]}
我试图返回学生参加过的课程(因此,基本上返回其“出席”字段中包含特定学生ID的任何课程。我尝试按如下方式执行此操作,但返回的结果为空。我的查询是否有问题

我试着检查这个链接,但它对我也不起作用。


解决方案是正确的,但是你的模式在这里是错误的。使用这样的数据库使用“命名密钥”存在很大的问题,而应该把它们看作“属性”。 例如:

{
“_id”:ObjectId(“559A7353186A384B54F9EA9”),
“出席情况”:[
{
“日期”:ISODate(“2015-12-17T00:00:00Z”),
“学生”:对象(“558febdb949eff4711e621e9”)
},
{
“日期”:ISODate(“2015-12-17T00:00:00Z”),
“学生”:对象(“559020FE79F141941DD3246”)
},
{
“日期”:ISODate(“2015-11-14T00:00:00Z”),
“学生”:对象(“558febdb949eff4711e621e9”)
},
{
“日期”:ISODate(“2015-11-14T00:00:00Z”),
“学生”:对象(“559020FE79F141941DD3246”)
}
]
}
在模式中定义为:

AttendanceSchmema=新模式({
“日期”:日期,
“student”:{“type”:Schema.Types.ObjectId,“ref”:“student”}
},{u id:false});
CourseSchema=新模式({
“出席”:[AttendanceSchema]
});
然后我可以简单地匹配给定的学生:

Course.find(
{“出席学生”:“559020FE79F141941DD3246”},
{“出席人数:$”:1}
)
甚至是某个特定日期的学生:

Course.find(
{“出席”:{
“$elemMatch”:{
“学生”:“559020FE79F141941DD3246”,
“日期:{“$gte”:新日期(“2015-12-15”),“$lt”:新日期(“2015-12-16”)}
}
}},
{“出席人数:$”:1}
)
我们之所以将所有这些放在一个具有类似“属性”属性的数组中,是为了简化查询和存储


如果没有这样的更改,您将不得不执行以下性能糟糕的查询:

Course.find({“$where”:function(){
返回对象.键(此考勤)。部分(功能(k){
返回此.attention[k].indexOf(“558febdb949eff4711e621e9”)
});
}})
当然,假设这些值目前是“字符串”,就像它们在
混合类型中显示的那样

更糟糕的是,对于任何更复杂的查询,也无法告诉您匹配了哪个位置。但到目前为止,最糟糕的是这些查询不可能使用“索引”来匹配


因此,您确实应该考虑将数据库模式更改为以最有效的方式支持查询的表单。

这里的问题是,您有“命名密钥”,如“代码>”2015-1217”。
这会妨碍引用的解决方案的使用。因此,您的架构设计选择是错误的。如果您更改架构,那么您可以以高效的方式完全做您想要做的事情。现在,唯一的方法根本不是很高效。非常感谢您,我将对此进行研究!仅使用c是否被视为不好的形式中途更改数据库模式?
{"_id":"559a7353186a384b54f9aea9","attendance":{"2015-12-17":["558febdb949eff4711e621e9","559020fe79f141941ddd3246"],"2015-11-14":["558febdb949eff4711e621e9","559020fe79f141941ddd3246"]}
Course.find({"attendance.$": {$in: ["558febdb949eff4711e621e9"]}}...)