mongodb获取包含属性的数组内的对象

时间:2018-05-07 17:59:17

标签: mongodb mongoose

我有一个mongodb表,其中包含一个足球锦标赛的装置,所以每个比赛周都是这样的:

 "number": 1,
 "games" : [
            {
                    "estadio" : "G C",
                    "arbitro" : "M",
                    "resultado" : "vs",
                    "editor" : "Pepe",
                    "_id" : ObjectId("5af0889e14553f0788bc9db8"),
                    "equipo_local" : "Las Palmas",
                    "equipo_visitante" : "Villareal",
                    "fecha" : "10/05/2018",
                    "horario" : "16:00",
                    "hora" : "12:12"
            },
            {
                    "estadio" : "Ciudad de Valencia",
                    "arbitro" : "A Confirmar",
                    "resultado" : "vs",
                    "editor" : "No Asignado",
                    "_id" : ObjectId("5af0889e14553f0788bc9db7"),
                    "equipo_local" : "Levante",
                    "equipo_visitante" : "Deportivo",
                    "fecha" : "28/01/2019",
                    "horario" : "18:00"
            },
            ..
          ]

我想找到游戏中的所有物品"游戏"包含"编辑器"的每个比赛周:" pepe",

我尝试过这样的事情

db.fechas.find({"games.editor": "Pepe"})

但这显示了每个游戏"包含"编辑器":" Pepe"的对象的数组,我只想要那个特定的对象,而不是整个数组。

1 个答案:

答案 0 :(得分:2)

find方法检查嵌套数组是否包含符合条件的任何文档并返回整个文档。

您需要聚合框架的$filter运算符来获取数组的子集,请尝试:

db.fechas.aggregate([
    {
        $addFields: {
            games: {
                $filter: {
                    input: "$games",
                    as: "game",
                    cond: {
                        $eq: [ "$$game.editor", "Pepe" ]
                    }
                }
            }
        }
    },
    {
        $match: {
            $expr: {
                $gt: [ { $size: "$games" }, 0 ]
            }
        }
    }
])

编辑:要删除games数组为空的文档,可以使用$match阶段指定条件作为表达式($expr)检查数组$size