sql >> データベース >  >> NoSQL >> MongoDB

マングースの友達スキーマのモデリング?

    だから最後に私はそれを作りました、そしてそれはおそらくmongodbとmongooseでそれをするための最良の方法だと思います

    1。 ユーザー向けのモデルを作成します。

        var Schema = mongoose.Schema
        const usersSchema = new Schema({
          firstName: { type: String, required: true },
          lastName: { type: String, required: true },
          friends: [{ type: Schema.Types.ObjectId, ref: 'Friends'}]
        }, {timestamps: true})
        module.exports = mongoose.model('Users', usersSchema)
    

    2。 承認、拒否、保留、および要求の列挙を持つ友人のモデルを作成します。

        const friendsSchema = new Schema({
          requester: { type: Schema.Types.ObjectId, ref: 'Users'},
          recipient: { type: Schema.Types.ObjectId, ref: 'Users'},
          status: {
            type: Number,
            enums: [
                0,    //'add friend',
                1,    //'requested',
                2,    //'pending',
                3,    //'friends'
            ]
          }
        }, {timestamps: true})
        module.exports = mongoose.model('Friends', friendsSchema)
    

    3。 ここで、API呼び出し-> 2人のユーザーUserAとUserBがあるとします...したがって、UserAがUserBに友達になるように要求すると、UserAが要求を確認し、UserBが保留中を確認できるように、同時に2つのドキュメントを作成します。ユーザーの友達にあるこれらのドキュメントの_id

        const docA = await Friend.findOneAndUpdate(
            { requester: UserA, recipient: UserB },
            { $set: { status: 1 }},
            { upsert: true, new: true }
        )
        const docB = await Friend.findOneAndUpdate(
            { recipient: UserA, requester: UserB },
            { $set: { status: 2 }},
            { upsert: true, new: true }
        )
        const updateUserA = await User.findOneAndUpdate(
            { _id: UserA },
            { $push: { friends: docA._id }}
        )
        const updateUserB = await User.findOneAndUpdate(
            { _id: UserB },
            { $push: { friends: docB._id }}
        )
    

    4。 UserBがリクエストを受け入れた場合

        Friend.findOneAndUpdate(
            { requester: UserA, recipient: UserB },
            { $set: { status: 3 }}
        )
        Friend.findOneAndUpdate(
            { recipient: UserA requester: UserB },
            { $set: { status: 3 }}
        )
    

    5。 UserBがリクエストを拒否した場合

        const docA = await Friend.findOneAndRemove(
            { requester: UserA, recipient: UserB }
        )
        const docB = await Friend.findOneAndRemove(
            { recipient: UserA, requester: UserB }
        )
        const updateUserA = await User.findOneAndUpdate(
            { _id: UserA },
            { $pull: { friends: docA._id }}
        )
        const updateUserB = await User.findOneAndUpdate(
            { _id: UserB },
            { $pull: { friends: docB._id }}
        )
    

    6。 すべての友達を取得し、ログインしているユーザーがそのユーザーの友達であるかどうかを確認します

    User.aggregate([
      { "$lookup": {
        "from": Friend.collection.name,
        "let": { "friends": "$friends" },
        "pipeline": [
          { "$match": {
            "recipient": mongoose.Types.ObjectId("5afaab572c4ec049aeb0bcba"),
            "$expr": { "$in": [ "$_id", "$$friends" ] }
          }},
          { "$project": { "status": 1 } }
        ],
        "as": "friends"
      }},
      { "$addFields": {
        "friendsStatus": {
          "$ifNull": [ { "$min": "$friends.status" }, 0 ]
        }
      }}
    ])
    


    1. node.jsおよびmongoとのシングルトン接続のセットアップ

    2. sidekiqでredis認証を構成する

    3. NodejsとD3をリアルタイムで使用して地図上に州の名前をプロットする

    4. MongoDBで接続が開かれたSocketTimeout