首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo对嵌套数组和返回不包含特定字段的文档进行筛选。

Mongo对嵌套数组和返回不包含特定字段的文档进行筛选。
EN

Stack Overflow用户
提问于 2019-12-16 23:22:32
回答 1查看 560关注 0票数 2

我有以下模式:

代码语言:javascript
复制
{
  "_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“没有属性”平台“的文档。因此,从本质上说,理想的结果是:

代码语言:javascript
复制
{
  "_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
              }
           ]
        }
     ]
  }
}

我试图通过投影/过滤查询专门使用聚合,但我似乎无法达到“平台”来检查它是否存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 00:27:39

问题是,在到达平台之前,您有多个嵌入式数组。您必须使用聚合框架来处理它们。

以下是查询:

代码语言:javascript
复制
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的相等(或不等于),可以检查元素是否存在。

您可以在这里测试查询。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59365592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档