प्रतिक्रिया में दस्तावेज़ को "संशोधित" करने वाली एकमात्र चीजें हैं .aggregate()
और .mapReduce()
, जहां पूर्व बेहतर विकल्प है।
उस स्थिति में आप $setDifference
. मांग रहे हैं जो "सेट" की तुलना करता है और दोनों के बीच "अंतर" देता है।
तो अपने सरणी के साथ एक दस्तावेज़ का प्रतिनिधित्व करना:
db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })
एकत्रीकरण चलाएँ:
db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])
कौन सा रिटर्न:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }
यदि आप "सेट" नहीं चाहते हैं और इसके बजाय [2,3,4,4]
जैसे सरणी की आपूर्ति करना चाहते हैं तो आप $filter
. से तुलना कर सकते हैं और $in
इसके बजाय, यदि आपके पास कम से कम MongoDB 3.4 है:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": { "$in": [ "$$a", "$b" ] }
}
}
}
}}
])
या $filter
. के साथ और $anyElementTrue
पुराने संस्करणों में:
db.collection.aggregate([
{ "$project": {
"c": {
"$filter": {
"input": [2,3,4,4],
"as": "a",
"cond": {
"$not": {
"$anyElementTrue": {
"$map": {
"input": "$b",
"as": "b",
"in": {
"$eq": [ "$$a", "$$b" ]
}
}
}
}
}
}
}
}}
])
दोनों कहाँ लौटेंगे:
{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }
जो निश्चित रूप से 4
. के बाद से "एक सेट नहीं" है इनपुट "दो बार" के रूप में प्रदान किया गया था और इसलिए इसे "दो बार" भी लौटाया जाता है।