我有以下模式:
{
"_id": 0,
"games": {
"gamesList": [
{
"franchiseName": "Tekken",
"genre": "Fighting",
"gamesInFranchise": [
{
"name": "Tekken 7",
"releaseDate": "03/18/2015",
"co-op": true,
"platforms": [
"playstation 3",
"xbox 360"
]
},
{
"name": "Tekken 6",
"releaseDate": "11/26/2007",
"co-op": true
},
{
"name": "Tekken 5",
"releaseDate": "01/01/2004",
"co-op": true
},
]
},
.................
]
}
}我想过滤基于特定的"_id“没有属性”平台“的文档。因此,从本质上说,理想的结果是:
{
"_id": 0,
"games": {
"gamesList": [
{
"franchiseName": "Tekken",
"genre": "Fighting",
"gamesInFranchise": [
{
"name": "Tekken 6",
"releaseDate": "11/26/2007",
"co-op": true
},
{
"name": "Tekken 5",
"releaseDate": "01/01/2004",
"co-op": true
}
]
}
]
}
}我试图通过投影/过滤查询专门使用聚合,但我似乎无法达到“平台”来检查它是否存在。
发布于 2019-12-17 00:27:39
问题是,在到达平台之前,您有多个嵌入式数组。您必须使用聚合框架来处理它们。
以下是查询:
db.collection.aggregate([
{
$match: {
_id: 0
}
},
{
$addFields: {
"games.gamesList": {
$map: {
input: "$games.gamesList",
as: "franchise",
in: {
"franchiseName": "$$franchise.franchiseName",
"genre": "$$franchise.genre",
"gamesInFranchise": {
$filter: {
input: "$$franchise.gamesInFranchise",
as: "gameInFranchise",
cond: {
$eq: [
null,
{
$ifNull: [
"$$gameInFranchise.platforms",
null
]
}
]
}
}
}
}
}
}
}
}
])我用$addFields来保护你的其他领域的安全。
请注意,您必须在'$map‘运算符的’字段‘中描述整个元素。
第一个$map操作符相对于第一级数组,$filter相对于第二级数组。
$ifNull是检查元素是否存在或返回某个元素的诀窍(此处设置为null)。通过检查带null的相等(或不等于),可以检查元素是否存在。
https://stackoverflow.com/questions/59365592
复制相似问题