【问题标题】:Mongodb (mongoose) I can't remove sub element from arrayMongodb(猫鼬)我无法从数组中删除子元素
【发布时间】:2021-06-14 19:57:15
【问题描述】:

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

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

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

【问题讨论】:

  • 你得到的错误是什么?请出示您的完整陈述。
  • 几个小时前我删除了这部分代码,因为我找不到如何使它工作,但错误是“无法在元素(我的数组)中创建字段'名称'”和 myarray是我根据我在示例中给出的相同模型创建的测试数组
  • 您既没有提供代码,也没有提供错误信息——您怎么能指望别人的帮助?
  • 对不起,我是新来的,我正在尽我所能澄清;(我只是想知道如何删除 player4,因为我确信我的代码是错误的,并且我没有正确使用更新方法...
  • ``` Rtournament.updateOne({'players.players.name':collection[i].players[j].name},{$pull:{'players.$.players': {'name':name}}},()=>{}); ``` 带有集合:“var collection = Rtournament.players;”

标签: javascript node.js database mongodb mongoose


【解决方案1】:

您可以使用它来根据您的组拉玩家。您必须传递组名和玩家名。

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

【讨论】:

  • 您好,感谢您的回答。我复制了您的代码并向 db.collection.update ((error)=>{console.log(error)}) 添加了一个参数以打印任何错误,但代码不起作用并且打印的错误为 null
  • 我添加了独立脚本供您测试,您可以用它重现您的错误
  • 非常感谢您花时间帮助我,效果很好,当我复制您的代码时,我在替换播放器名称时出错了...我测试了您的独立脚本,它可以工作好
猜你喜欢
  • 2018-05-28
  • 2022-08-02
  • 1970-01-01
  • 2020-06-10
  • 2019-09-04
  • 2017-12-22
  • 2013-01-23
  • 2020-12-18
  • 2015-06-12
相关资源
最近更新 更多