MongoDB में, $in
एकत्रीकरण पाइपलाइन ऑपरेटर एक बूलियन देता है जो दर्शाता है कि निर्दिष्ट मान सरणी में है या नहीं।
$in
एग्रीगेशन पाइपलाइन ऑपरेटर को $in
. के साथ भ्रमित नहीं होना चाहिए क्वेरी ऑपरेटर, जो उन दस्तावेज़ों का चयन करता है जहाँ फ़ील्ड का मान निर्दिष्ट सरणी में किसी भी मान के बराबर होता है।
उदाहरण
मान लीजिए हमारे पास products
. नामक संग्रह है निम्नलिखित दस्तावेजों के साथ:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
हम $in
. का उपयोग कर सकते हैं ऑपरेटर यह पता लगाने के लिए कि sizes
. है या नहीं फ़ील्ड में मान L
. है ।
उदाहरण:
db.products.aggregate(
[
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
परिणाम:
{ "_id" : 1, "hasLarge" : false } { "_id" : 2, "hasLarge" : true } { "_id" : 3, "hasLarge" : true }
दूसरा तर्क एक सरणी में हल होना चाहिए
$in
. का दूसरा तर्क ऑपरेटर को एक सरणी को हल करना होगा। यदि ऐसा नहीं होता है, तो एक त्रुटि लौटा दी जाती है।
मान लीजिए कि हम निम्नलिखित दस्तावेज़ को संग्रह में जोड़ते हैं:
{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" }
ध्यान दें कि sizes
फ़ील्ड एक सरणी नहीं है - यह एक स्ट्रिंग है।
आइए लागू करते हैं $in
उस दस्तावेज़ के लिए:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
परिणाम:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: string", "code" : 40081, "codeName" : "Location40081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
इस मामले में, sizes
फ़ील्ड में एक स्ट्रिंग है, और इसलिए एक त्रुटि वापस आ जाती है।
इस उदाहरण में, मैं $in
. का भी उपयोग करता हूं $match
. के साथ दस्तावेज़ों को केवल उन दस्तावेज़ों को फ़िल्टर करने के लिए जिनमें मेरी रुचि है। ध्यान दें कि यह $in
का उपयोग करता है क्वेरी ऑपरेटर सिंटैक्स, जो एक तर्क को स्वीकार करता है, और दो तर्क सिंटैक्स के साथ भ्रमित नहीं होना है।
शून्य मान
वही होगा यदि दूसरा तर्क null
. है .
आइए संग्रह में निम्नलिखित दस्तावेज़ जोड़ें:
{ "_id" : 5, "prod" : "Jeans", "sizes" : null }
अगर हम $in
. का उपयोग करने का प्रयास करते हैं तो यहां क्या होता है उस दस्तावेज़ के साथ:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
परिणाम:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: null", "code" : 40081, "codeName" : "Location40081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
वही त्रुटि।
अनुपलब्ध फ़ील्ड
लापता फ़ील्ड के साथ भी ऐसा ही है।
मान लीजिए हम अपने संग्रह में निम्नलिखित दस्तावेज़ जोड़ते हैं:
{ "_id" : 6, "prod" : "Shorts" }
और अब हम $in
. लागू करने का प्रयास करते हैं (गैर-मौजूद) sizes
. के लिए फ़ील्ड:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
परिणाम:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: missing", "code" : 40081, "codeName" : "Location40081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
रेगुलर एक्सप्रेशन
$in
. के विपरीत क्वेरी ऑपरेटर, $in
एकत्रीकरण पाइपलाइन ऑपरेटर नियमित अभिव्यक्तियों के उपयोग का समर्थन नहीं करता है।
इसलिए, निम्न कोड के परिणामस्वरूप मिलान नहीं होता:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
hasLarge: { $in: [ /^X/, "$sizes" ] }
}
}
]
)
परिणाम:
{ "_id" : 1, "hasLarge" : false } { "_id" : 2, "hasLarge" : false } { "_id" : 3, "hasLarge" : false }
सभी दस्तावेज़ों का परिणाम false
है , भले ही sizes
तीनों दस्तावेज़ों में फ़ील्ड में सरणी तत्व होते हैं जो अपरकेस X
. से शुरू होते हैं ।