以下是文档的相关部分的外观:
{
"map": {
"cities": [
{
"name": "City1",
"x": 15,
"y": 5,
"owner": 1,
"defense": 6,
"income": 35
},
{
"name": "City2",
"x": 12,
"y": 14,
"owner": 0,
"defense": 4,
"income": 16
},
{
"name": "City3",
"x": 6,
"y": 19,
"owner": 2,
"defense": 3,
"income": 12
}
]
},
"players": [
{
"userid": "64d3ebfb42fb5b118b928f5c",
"faction": 1
},
{
"userid": "636f89f0d4666b666237cec8",
"faction": 2
}
]
}
如果我是Player1(userid:"64d3ebfb42fb5b118b928f5c"),现在如何编写一个查询来输出以下内容:
{
"map": {
"cities": [
{
"name": "City1",
"x": 15,
"y": 5,
"owner": 1,
"defense": 6,
"income": 35
},
{
"name": "City2",
"x": 12,
"y": 14,
"owner": 0
},
{
"name": "City3",
"x": 6,
"y": 19,
"owner": 2
}
]
}
}
2号播放器返回(userid:"636f89f0d4666b666237cec8"):
{
"map": {
"cities": [
{
"name": "City1",
"x": 15,
"y": 5,
"owner": 1
},
{
"name": "City2",
"x": 12,
"y": 14,
"owner": 0
},
{
"name": "City3",
"x": 6,
"y": 19,
"owner": 2,
"defense": 3,
"income": 12
}
]
}
}
- 查询应仅接受用户ID作为输入
- 只有当"players.side"与"map.cities.owner"匹配时,才会显示"Defense"和"Income"的实际值.
- 玩家不能看到他/她不拥有的城市的价值
- 如果玩家不拥有城市,则值默认为例如0
我知道我可以只查询并以编程方式删除它,但我想知道是否可以做得更好.
我试过这样做,但显然不起作用,因为"$map.cities.owner"/"$map.cities.Defense"实际上是一个数组/返回一个array.
{
_id: 0,
"map.cities.name": 1,
"map.cities.x": 1,
"map.cities.y": 1,
"map.cities.owner": 1,
"map.cities.defense": {
$cond: {
if: {
$eq: ["$map.cities.owner", 1],
},
then: "$map.cities.defense",
else: "$$REMOVE",
},
},
}
我试着使用$filter
,但很快就变得非常麻烦,我从未得到我想要的结果.
我试着在map.cities
上使用$unwind
,但很难再次将其放入单个文档中.