我有一个包含以下文档的收藏集:
{
"_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
}
}
}
})
但是我收到此错误:无法执行该动作。请检查您的参数。
我不确定该如何完成并希望获得帮助...
预先感谢:-)
答案 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"
}
]
}
]