您的集合中有多个嵌套数组,而在 MongoDB 中,您不能使用多个 positional operator 对您的玩家集合执行更新操作。您应该为您的玩家定义一个name 字段和一个role 字段。您可以按如下方式构建数据:
团队/赛季文件
{
"_id": ObjectId("58b99f08a7a2dfe1174e8eb9"),
"team": "Dragons",
"season": "2016-17",
"players": [{
"name": "Oliver queen",
"role": "pitcher"
}, {
"name": "SomeOne",
"role": "pitcher"
}, {
"name": "Slade Wilson",
"role": "catcher"
}]
}
因此,每个独特的团队/赛季对将拥有一份文件,因此:
- 第一个文档:
Dragons/2016-17
- 第二个文档:
Dragons/2015-17
- 等等……
根据他们的位置(即“投手”)显示单个玩家,
特定球队的特定赛季。例如我想知道谁
投手是 2015-16 赛季为龙队效力的。
_如果你只有一个角色使用:
db.players.find({
"team": "Dragons",
"season": "2016-17",
"players.role": "pitcher"
}, { "players.$": 1 })
它只会返回第一个匹配pitcher角色的玩家:
{ "_id": ObjectId("58b99f08a7a2dfe1174e8eb9"), "players": [{ "name": "Oliver queen", "role": "pitcher" }] }
_ 如果您可以按角色拥有多个玩家(如上面的模型中),请使用aggregation 到$filter 与匹配角色的players 数组:
db.players.aggregate([{
$match: {
"team": "Dragons",
"season": "2016-17",
"players.role": "pitcher"
}
}, {
$project: {
players: {
$filter: {
input: "$players",
as: "player",
cond: { $eq: ["$$player.role", "pitcher"] }
}
}
}
}])
这给了你:
{ "_id": ObjectId("58b99f08a7a2dfe1174e8eb9"), "players": [{ "name": "Oliver queen", "role": "pitcher" }, { "name": "SomeOne", "role": "pitcher" }] }
显示所有球员,根据他们的位置,在所有赛季的
龙队。
使用players.role 聚合分组:
db.players.aggregate([{
$match: {
"team": "Dragons"
}
}, {
$unwind: "$players"
}, {
$group: {
_id: "$players.role",
players: {
$push: "$players.name"
}
}
}])
这给了:
{ "_id": "catcher", "players": ["Slade Wilson", "Batman"] } { "_id": "pitcher", "players": ["Oliver queen", "SomeOne", "Joker"] }
更新特定赛季中特定球员的姓名
特定的团队。 (例如,在 2016-17 赛季更新“投手”为
从“奥利弗女王”到“绿箭侠”的龙
更新 positional parameter 匹配找到的项目:
db.players.update({
"team": "Dragons",
"season": "2016-17",
"players.name": "Oliver queen"
}, {
$set: {
"players.$.name": "Green Arrow"
}
});
球队/赛季/球员文件
{
"team": "Dragons",
"season": "2016-17",
"name": "Oliver queen",
"role": "pitcher"
}, {
"team": "Dragons",
"season": "2016-17",
"name": "SomeOne",
"role": "pitcher"
}, {
"team": "Dragons",
"season": "2016-17",
"name": "Slade Wilson",
"role": "catcher"
}
每份文件都包含特定球队、特定赛季的一名球员
根据他们的位置(即“投手”)显示单个玩家,
特定球队的特定赛季。例如我想知道谁
投手是 2015-16 赛季为龙队效力的。
db.players.find({ "team": "Dragons", "season": "2016-17", "role": "pitcher" })
显示所有球员,根据他们的位置,在所有赛季的
龙队。
db.players.find({"team": "Dragons", "role": "pitcher"})
更新特定赛季中特定球员的姓名
特定的团队。 (例如,在 2016-17 赛季更新“投手”为
从“奥利弗女王”到“绿箭侠”的龙
db.players.update({
"team": "Dragons",
"season": "2016-17",
"name": "Oliver queen"
}, {
$set: {
"name": "Green Arrow"
}
})