Mongodb(猫鼬)我无法从数组中删除子元素

时间:2021-03-17 13:10:16

标签: javascript node.js database mongodb mongoose

我正在为一位朋友创建一个英雄联盟锦标赛网站,并且每个锦标赛(存储在 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}}},()=>{});

所以我想知道一个简单的方法来删除它(因为我确定我的代码确实是错误的)

非常感谢帮助我并为我糟糕的英语感到抱歉

1 个答案:

答案 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')
}