MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

नेवला में दोस्तों स्कीमा के लिए मॉडलिंग?

तो अंत में मैंने इसे बनाया और मुझे लगता है कि यह मोंगोडब और नेवला के साथ ऐसा करने का शायद सबसे अच्छा तरीका है

<ब्लॉकक्वॉट>

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. अब एपीआई कॉल -> मान लें कि हमारे पास दो उपयोगकर्ता उपयोगकर्ता ए और उपयोगकर्ता बी हैं ... तो जब उपयोगकर्ता ए उपयोगकर्ता बी को उस समय मित्र बनने का अनुरोध करता है तो हम दो दस्तावेज़ बनाते हैं ताकि उपयोगकर्ता ए अनुरोधित देख सके और उपयोगकर्ता बी लंबित देख सके और साथ ही हम धक्का दे सकें उपयोगकर्ता के मित्रों में इन दस्तावेज़ों की _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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एकाधिक मानदंड द्वारा नेस्टेड ऐरे से ऑब्जेक्ट निकालें

  2. ट्रैकिंग MongoDB मेमोरी उपयोग

  3. पथ 'x' को अद्यतन करने से 'x' पर विरोध उत्पन्न होगा

  4. एक नेवला स्कीमा में कोई MongoDB GeoJSON फ़ील्ड का प्रतिनिधित्व कैसे करता है?

  5. node.js और एक्सप्रेस - वैश्विक मॉड्यूल और अनुप्रयोग संरचना के लिए सर्वोत्तम अभ्यास