首页 > 解决方案 > 带有猫鼬或 SQL 的 MongoDB

问题描述

我对 mongoDB 有点陌生,我想弄清楚我应该使用 MongoDB 还是使用熟悉的 SQL。

起初我真的很想使用 MongoDB,但它真的很慢,而且我很难设计我的数据库和查询。

例如: SQL

假设我有这些表:

User Table (Id, Name)

Group (Id, Name)

GroupInvites (UserId, GroupId, Status[A - active, I - invited])

如果我想知道一个玩家是否有和组邀请,从 GroupInvites 表中选择和更新将非常容易。

MongoDB

但在 MongoDB 中,GroupInvites 是多余的,因为我们可以在组方案中拥有 Status。

const BetGroupSchema = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    users: [{
        userId: {
            type: mongoose.SchemaTypes.ObjectId,
            ref: 'users',
            required: true
        },
        userStatus: {
            type: String,
            required: true
        }
     }]
})

但是现在,如果我只想选择特定用户有邀请的组,那就更难了——

Group.find({
    "users.userId": req.user._id,
    "users.userStatus": "I"
}) 

这样做的结果将给出具有 UserID 的所有组和具有 UserStatus = 'I' 的所有组。

而且我找不到直接更新数据库的快速方法,如果我想将特定用户状态更新为“A”。

也许我弄错了,有人可以向我展示在 MongoDB 中实现它的好方法,或者您认为使用 SQL 会更好。

标签: mongodbmongoose

解决方案


我可以理解,作为一个初学者,即使是简单的查询也很难做好,如果我在你的位置,我会按照以下方式进行这样的查询

1.查找嵌套在数组中的文档的查询:

 Group.find({users: {$elemMatch: {userId:req.user._id, userStatus:"I"}}})

2. 更新嵌套在数组中的文档的查询:

Group.update( { "name": "John","users.userId" : req.user._id }, 
              { "$set": { "users.$.userStatus": "A" } } )

推荐阅读