MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Membuat model untuk skema teman di luwak?

Jadi Akhirnya saya berhasil dan saya pikir ini mungkin cara terbaik untuk melakukannya dengan mongodb dan luwak

1. Buat model untuk pengguna.

    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. Buat model untuk teman yang memiliki enum untuk diterima, ditolak, tertunda, dan diminta.

    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. Sekarang panggilan api -> Katakanlah kita memiliki dua pengguna UserA dan UserB ... Jadi ketika UserA meminta UserB untuk menjadi teman pada saat itu kami membuat dua dokumen sehingga UserA dapat melihat yang diminta dan UserB dapat melihat pending dan pada saat yang sama kami push _id dokumen ini di teman pengguna

    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. Jika UserB menerima permintaan

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

5. Jika UserB menolak permintaan

    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. Dapatkan semua teman dan periksa apakah pengguna yang masuk adalah teman dari pengguna itu atau bukan

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tambahkan Leading Zeros di SQL

  2. konversi tanggal iso ke stempel waktu dalam kueri mongo

  3. Benchmarking MongoDB - Mendorong Kinerja NoSQL

  4. urutkan berdasarkan panjang string di Mongodb/pymongo

  5. MongoDB:Menggabungkan data dari beberapa koleksi menjadi satu..bagaimana?