我们做出了将数据库从SQL转换到noSQL的决定,我对最佳实践以及我目前的实现是否可以改进提出了一些问题。
我现在的SQL实现了游戏结束后对玩家数据的更新。
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_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 },
);
});蒙戈有更好的方法来实现这一点吗?我试着使用updateMany和bulkUpdate,但没有得到预期的结果。
除了mongo.db之外,还有哪些技巧、技巧或资源可以推荐给那些从SQL迁移到noSQL的用户呢?
再次感谢!
发布于 2021-03-23 07:33:00
你的方法很好。然而,也有一些缺陷:
updateOne按照名称的含义准确地更新一个文档。因此,multi: true已经过时。$inc: { score: player.score },而不是“S核”Player_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命令时,效果更好。
当然,当您执行第一个find、delete、insert、update时,您将看到许多与SQL的类比,但是当您接近聚合框架时,如果您试图将它们转换为SQL,或者相反,您就会迷路。
https://stackoverflow.com/questions/66758316
复制相似问题