तो अंत में मैंने इसे बनाया और मुझे लगता है कि यह मोंगोडब और नेवला के साथ ऐसा करने का शायद सबसे अच्छा तरीका है
<ब्लॉकक्वॉट>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 ]
}
}}
])