Node.js 如何优化我的MongoDB Upsert语句?
我们决定将数据库从SQL切换到noSQL,我对最佳实践有一些疑问,以及我当前的实现是否可以改进 我当前的SQL实现用于在游戏结束后升级玩家数据Node.js 如何优化我的MongoDB Upsert语句?,node.js,mongodb,Node.js,Mongodb,我们决定将数据库从SQL切换到noSQL,我对最佳实践有一些疑问,以及我当前的实现是否可以改进 我当前的SQL实现用于在游戏结束后升级玩家数据 let template = Players.map( (player) => `( ${player.Rank},"${player.Player_ID}","${player.Player}",${player.Score},${tpp},1
let template = Players.map(
(player) =>
`(
${player.Rank},"${player.Player_ID}","${player.Player}",${player.Score},${tpp},1
)`,
).join(',');
let stmt = `INSERT INTO playerStats (Rank, Player_ID, Player, Score, TPP, Games_Played)
VALUES ${template}
ON CONFLICT(Player_ID) DO UPDATE
SET Score = Score+excluded.Score,
Games_Played=Games_Played+1,
TPP=TPP+excluded.TPP`;
db.run(stmt, function (upsert_error) { ...
预期代码是通过检查当前Player\u id
是否存在来更新现有播放器。如果是的话,更新他们的分数。否则请插入一个新的播放器
Mongo实现
const players = [
{ name: 'George', score: 10, id: 'g65873' },
{ name: 'Wayne', score: 100, id: 'g63853' },
{ name: 'Jhonny', score: 500, id: 'b1234' },
{ name: 'David', score: 3, id: 'a5678' },
{ name: 'Dallas', score: 333333, id: 'a98234' },
];
const db = client.db(dbName);
const results = players.map((player) => {
// updateOne(query, update, options)
db.collection('Players')
.updateOne(
{ Player_Name: player.name },
{
$setOnInsert: { Player_Name: player.name, id: player.id },
$inc: { Score: player.score },
},
{ upsert: true, multi: true },
);
});
mongo是否有更好的方法来实现这一点?我尝试使用updateMany和bulkUpdate,但没有得到预期的结果
除了mongo.db之外,对于那些从SQL迁移到noSQL的人,您还有什么建议、技巧或资源吗
再次感谢 你的方法很好。但是,也存在一些缺陷:
- 命令
只更新名称所示的一个文档。因此updateOne
这是过时的multi:true
- 字段名区分大小写(与大多数SQL数据库不同)。它应该是
,而不是“Score”$inc:{score:player.score}
- 字段
不存在,它将永远找不到任何要更新的文档Player\u Name
db.collection('Players').updateOne(
{ name: player.name }, //or { id: player.id } ?
{
$setOnInsert: { name: player.name, id: player.id },
$inc: { score: player.score },
},
{ upsert: true }
)
根据我的经验,如果您试图将脑海中的SQL语句一个接一个地转换为NoSQL命令,那么从SQL迁移到NoSQL会更加困难。对我来说,当我摒弃了SQL的思想并尝试从头开始理解和开发NoSQL命令时,它工作得更好
当然,当您第一次执行
查找
,删除
,插入
,更新
时,您将看到许多与SQL的类似之处,但最近当您接近SQL时,如果您试图将它们转换为SQL,您就会迷失方向。谢谢!这真的帮了我的忙!