我正在为一位朋友创建一个英雄联盟锦标赛网站,并且每个锦标赛(存储在 mongodb 的数据库中)都有一个想要参加锦标赛的“预制”玩家列表。
我在 node.js 上使用 mongoose 模块来管理我的数据库
这是我的模型:
const tournamentSchema = mongoose.Schema({
name: {
type:String,
required:true,
trim: true
},
beginningDate: Date,
endingDate: Date,
creatorName: {
type:String,
required:true,
lowercase: true,
trim: true
},
maxPlayers:Number,
maxPlayersPerTeam:Number,
playersList:Array,
waitingPlayers:Array,
needLoggin:{
type:Boolean,
default:false
},
description:String
});
例如,“playersList”将是:
playersList:[
{
name:"group1",
players:[
{
name:"player1",
elo:"rank on the game"
},
{
name:"player2",
elo:"rank on the game"
}
]
},
{
name:"group2",
players:[
{
name:"player3",
elo:"rank on the game"
},
{
name:"player4",
elo:"rank on the game"
}
]
}
]
我正在寻找如何删除
{
name:"player4",
elo:"rank on the game"
}
以第 2 组为例。我尝试使用 splice() 就像它是一个普通数组一样,它更新了对象但在数据库中什么也没做。我还尝试了锦标赛.更新,但它返回了一个错误,我看不出我的错误是什么...
var collection = Rtournament.players;
Rtournament.updateOne({'players.players.name':collection[i].players[j].name},{$pull:{'players.$.players':{'name':name}}},()=>{});
所以我想知道一个简单的方法来删除它(因为我确定我的代码确实是错误的)
非常感谢帮助我并为我糟糕的英语感到抱歉
答案 0 :(得分:0)
您可以使用它根据您的组拉动玩家。您必须传递组名和玩家名。
db.collection.update({
$and: [
{
name: "group2"
},
{
"players.name": "player4"
}
]
},
{
$pull: {
players: {
name: "player4"
}
}
})
Mongo 游乐场:https://mongoplayground.net/p/HEusd_OBO1F
这是要测试的独立脚本,让我知道它是否有效 在 shell 中启动 mongodb,然后在终端中运行 node repro.js
const mongoose = require('mongoose');
const tournamentSchema = mongoose.Schema({
name: {
type:String,
required:true,
trim: true
},
beginningDate: Date,
endingDate: Date,
creatorName: {
type:String,
lowercase: true,
trim: true
},
maxPlayers:Number,
maxPlayersPerTeam:Number,
players:Array,
waitingPlayers:Array,
needLoggin:{
type:Boolean,
default:false
},
description:String
});
run().catch((err) => console.log(err));
async function run() {
await mongoose.connect('mongodb://localhost:27017/test', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
await mongoose.connection.dropDatabase();
const TournamentModel = mongoose.model('tournament', tournamentSchema);
await TournamentModel.insertMany([
{
name:"group1",
players:[
{
name:"player1",
elo:"rank on the game"
},
{
name:"player2",
elo:"rank on the game"
}
]
},
{
name:"group2",
players:[
{
name:"player3",
elo:"rank on the game"
},
{
name:"player4",
elo:"rank on the game"
}
]
}
])
await TournamentModel.updateOne({
$and: [
{
name: "group2"
},
{
"players.name": "player4"
}
]
},
{
$pull: {
players: {
name: "player4"
}
}
});
const result = await TournamentModel.find({}).lean()
console.log(JSON.stringify(result), 'result')
}