我有一个名为“考勤”的集合,它有一个数组:
[
{
"faculty": "20XX-XXXXX-XX-1",
"sections": [
{
"section": "XXXX 3-1",
"date": "04-11-2022",
"attendance": [
{
"number": "XXXXX",
"status": "Present"
},
{
"number": "XXXXX",
"status": "Present"
},
{
"number": "XXXXX",
"status": "Present"
}
]
},
{
"section": "XXXX 3-2",
"date": "04-11-2022",
"attendance": [
{
"number": "XXXXX",
"status": "Present"
},
{
"number": "XXXXX",
"status": "Present"
},
{
"number": "XXXXX",
"status": "Present"
}
]
}
]
}
]我一直试图使用$and和$elemMatch查询数组中特定元素的值:
db.attendance.find({$and:[{faculty:"20XX-XXXXX-XX-1"},{sections:{$elemMatch:{section:"XXXX 3-1",date:"04-11-2022"}}}]});但它仍然印在另一个部分而不是一个。我希望产出如下:
{
"faculty": "20XX-XXXXX-XX-1",
"sections": [
{
"section": "XXXX 3-1",
"date": "04-11-2022",
"attendance": [
{
"number": "XXXXX",
"status": "Present"
},
{
"number": "XXXXX",
"status": "Present"
},
{
"number": "XXXXX",
"status": "Present"
}
]
}我试着用点表示法,比如:
db.attendance.find({"sections.section":"XXXX 3-1", "sections.date":"04-11-2022});还是没有运气。我不确定我做的是对还是错。提前感谢!
发布于 2022-04-11 20:10:39
选项1:/elemMatch->您还需要将$elemMatch添加到查找查询的项目部分,如下所示:
db.collection.find({
"faculty": "20XX-XXXXX-XX-1",
sections: {
$elemMatch: {
section: "XXXX 3-1",
date: "04-11-2022"
}
}
},
{
sections: {
$elemMatch: {
section: "XXXX 3-1",
date: "04-11-2022"
}
}
})解释:
查找查询具有以下syntax:db.collection.find({ query },{ project }),添加项目部分允许您筛选预期的输出。
选项2:通过聚合/$filter:
db.collection.aggregate([
{
"$addFields": {
"sections": {
"$filter": {
"input": "$sections",
"as": "s",
"cond": {
$and: [
{
$eq: [
"$$s.section",
"XXXX 3-1"
]
},
{
$eq: [
"$$s.date",
"04-11-2022"
]
}
]
}
}
}
}
}
])解释:
将原始区段数组替换为根据所提供的条件过滤数组元素的新区段数组。
https://stackoverflow.com/questions/71831340
复制相似问题