javascript - Mongodb(猫鼬)我无法从数组中删除子元素
问题描述
我正在为一个朋友创建一个英雄联盟锦标赛网站,并且对于每个锦标赛(存储在 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}}},()=>{});
所以我想知道一个简单的方法来删除它(因为我确定我的代码真的错了)
非常感谢帮助我,对我糟糕的英语感到抱歉
解决方案
您可以使用它来根据您的组拉玩家。您将必须传递组名和玩家名。
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')
}
推荐阅读
- php - Mysql获取90天内的记录
- java - 根据对象在 Java 中的接口实现来处理对象
- python - 如何在本地机器上为 linux 发布二进制 Python 轮子
- java - 无法在 spring-data 中编写正确的请求
- css - 高度 100% 使用 flex-wrap
- algorithm - KMV算法中不同大小的多个K最小值集合的并集
- r - 在闪亮中分组文本输入框
- excel - Excel VBA-如何用科学计数法识别单元格
- java - Kaa Sandbox 未从 Cellmonitor 示例应用程序接收数据
- python - 如何在 Python 中使用二分搜索查找多个值