MongoDB使用动态键在嵌套文档中搜索?

时间:2019-02-03 06:36:22

标签: arrays mongodb find

我有一个包含以下文档的收藏集:

{
  "_id": {
    "$oid": "582b5fdf09ecd804b275894c"
  },
  "scriptData": {
    "playerStats": {
      "582b5f9409ecd804b2752bc7": {
        "status": "closed",
        "tileSum": "0"
      },
      "582b6082d20c9404b29d4d6f": {
        "status": "closed",
        "tileSum": "16"
      }
    }
  },
  "startDate": {
    "$date": {
      "$numberLong": "1479237815109"
    }
  },
  "nextPlayer": "582b6082d20c9404b29d4d6f"
}

我要完成的工作是找到tileSum大于200(但未成功)的每个文档。 playerStats中的键是动态的。这是玩家ID。

我尝试过这样:

db.collection.find({
       "scriptData":{
          "playerStats":{
             "tileSum":{
                "$gt":200
             }
          }
       }
    })

但是我收到此错误:无法执行该动作。请检查您的参数。

我不确定该如何完成并希望获得帮助...

预先感谢:-)

1 个答案:

答案 0 :(得分:0)

一种可能的方法是将playerStats包装在数组中,然后使用$filter在数组中进行比较:

数据:

{
    "_id": {
      "$oid": "582b5fdf09ecd804b275894c"
    },
    "scriptData": {
      "playerStats": [
        {
          "id": "582b5f9409ecd804b2752bc7",
          "status": "closed",
          "tileSum": "0"
        },
        {
          "id": "582b6082d20c9404b29d4d6f",
          "status": "closed",
          "tileSum": "16"
        }
      ]
    },
    "startDate": {
      "$date": {
        "$numberLong": "1479237815109"
      }
    },
    "nextPlayer": "582b6082d20c9404b29d4d6f"
  }

查询:

db.collection.aggregate([
  {
    $project: {
      items: {
        $filter: {
          input: "$scriptData.playerStats",
          as: "item",
          cond: {
            $gte: [
              "$$item.tileSum",
              "16"
            ]
          }
        }
      }
    }
  }
])

结果:

[
  {
    "_id": ObjectId("582b5fdf09ecd804b275894c"),
    "items": [
      {
        "id": "582b6082d20c9404b29d4d6f",
        "status": "closed",
        "tileSum": "16"
      }
    ]
  }
]