MongoDB में एक $push
है ऑपरेटर और एक $addToSet
ऑपरेटर, जिनमें से दोनों एक समान काम करते हैं।
दोनों ऑपरेटर मौजूदा सरणी में मान जोड़ते हैं। मुख्य अंतर यह है कि वे उन सरणियों से कैसे निपटते हैं जिनमें पहले से ही वह मूल्य होता है जिसे आप जोड़ने की कोशिश कर रहे हैं, और उन संशोधक में भी जिनका उपयोग किया जा सकता है।
मतभेद
मौजूदा मान | यदि मान पहले से ही सरणी में मौजूद है, $push अभी भी मूल्य जोड़ देगा (परिणामस्वरूप डुप्लिकेट मान)। हालांकि, $addToSet केवल मान जोड़ता है यदि यह पहले से ही सरणी में मौजूद नहीं है। इसलिए, यदि मान पहले से मौजूद है, $addToSet इसे संलग्न नहीं करेगा (यह कुछ नहीं करेगा)। |
संशोधक | द $push ऑपरेटर का उपयोग अतिरिक्त संशोधक के साथ किया जा सकता है, जैसे $sort , $slice , और $position , जबकि $addToSet नहीं कर सकता (कम से कम, MongoDB 4.4 के अनुसार नहीं)। |
मौजूदा मान
मान लीजिए कि हमारे पास निम्नलिखित दस्तावेजों के साथ एक संग्रह है:
db.players.find()
परिणाम:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 3, 5, 5 ] }
आइए $addToSet
. का उपयोग करें किसी एक सरणी में मान जोड़ने का प्रयास करने के लिए।
db.players.update(
{ _id: 3 },
{ $addToSet: { scores: 5 } }
)
आउटपुट:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
यह हमें बताता है कि एक मेल खाने वाला दस्तावेज़ था (दस्तावेज़ 3), लेकिन उसे संशोधित नहीं किया गया था। इसे संशोधित नहीं किया गया था क्योंकि हमने जिस मान को सम्मिलित करने का प्रयास किया था (5
) पहले से ही सरणी में मौजूद है।
आइए इस संग्रह में देखें:
db.players.find()
परिणाम:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 3, 5, 5 ] }
जैसा अपेक्षित था, दस्तावेज़ 3 को बदला नहीं गया है।
आइए $push
का प्रयास करें इसके बजाय:
db.players.update(
{ _id: 3 },
{ $push: { scores: 5 } }
)
आउटपुट:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
इस बार हम देखते हैं कि दस्तावेज़ को संशोधित किया गया था।
हम संग्रह की दोबारा जांच करके इसकी पुष्टि कर सकते हैं:
db.products.find()
परिणाम:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 3, 5, 5, 5 ] }
संशोधक
$push
संशोधक के साथ ऑपरेटर का उपयोग किया जा सकता है जैसे $position
, $sort
, और $slice
.
$addToSet
इन संशोधकों के साथ ऑपरेटर का उपयोग नहीं किया जा सकता है।
यदि मैं $addToSet
. के साथ इन संशोधकों का उपयोग करने का प्रयास करता हूं तो यहां क्या होता है :
db.players.update(
{ _id: 3 },
{
$addToSet: {
scores: {
$each: [ 12 ],
$position: 0,
$sort: 1,
$slice: 5
}
}
}
)
आउटपुट:
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 2, "errmsg" : "Found unexpected fields after $each in $addToSet: { $each: [ 12.0 ], $position: 0.0, $sort: 1.0, $slice: 5.0 }" } })
त्रुटि संदेश हमें बताता है कि $position
, $sort
, और $slice
अनपेक्षित क्षेत्र हैं (अर्थात उन्हें वहां नहीं होना चाहिए)।
आइए उन्हीं संशोधकों को $push
. के साथ आज़माएं :
db.players.update(
{ _id: 3 },
{
$push: {
scores: {
$each: [ 12 ],
$position: 0,
$sort: 1,
$slice: 5
}
}
}
)
आउटपुट:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
इस बार इसने बिना किसी त्रुटि के काम किया।
परिणाम सत्यापित करें:
db.players.find()
परिणाम:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 3, 5, 5, 5, 12 ] }
हम देख सकते हैं कि मान जोड़ा गया है। भले ही हमने $position: 0
. निर्दिष्ट किया हो , हमने $sort: 1
. भी निर्दिष्ट किया है , जिसका अर्थ है कि हमारे द्वारा तैनात किए जाने के बाद सरणी को क्रमबद्ध किया गया था।
हमने $slice: 5
. भी निर्दिष्ट किया है , जिसने सरणी को केवल 5 तत्वों तक सीमित कर दिया (जो जैसा कि यह निकला, वैसे भी सरणी में कितने तत्व थे)।