মঙ্গোডিবি-র অনাইন্ড অপারেটর কী?


107

এটি মঙ্গোডিবিয়ের সাথে আমার প্রথম দিন তাই দয়া করে আমার সাথে সহজ হয়ে যান :)

আমি $unwindঅপারেটরটি বুঝতে পারি না , কারণ ইংরেজি আমার মাতৃভাষা নয়।

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);

প্রকল্প অপারেটর এমন কিছু যা আমি বুঝতে পারি, আমি মনে করি (এটি এর মতো SELECT, তাই না?) তবে তারপরে, $unwind(উদ্ধৃতি দিয়ে) প্রতিটি উত্স নথির মধ্যে আনবাউন্ড অ্যারের প্রতিটি সদস্যের জন্য একটি নথি ফেরত দেয়

এটি কি এর মতো JOIN? যদি হ্যাঁ, কিভাবে ফল $project(সঙ্গে _id, author, titleএবং tagsক্ষেত্র) সঙ্গে তুলনা করা যেতে পারে tagsঅ্যারের?

দ্রষ্টব্য : আমি মঙ্গোডিবি ওয়েবসাইট থেকে উদাহরণটি নিয়েছি, আমি tagsঅ্যারের কাঠামো জানি না । আমি মনে করি এটি ট্যাগ নামের একটি সহজ অ্যারে।

উত্তর:


249

প্রথমে, মঙ্গোডিবিতে আপনাকে স্বাগতম!

মনে রাখার বিষয়টি হ'ল মংগাডিবি ডেটা সঞ্চয় করার জন্য "নোএসকিউএল" পদ্ধতির নিয়োগ করে, তাই আপনার মন থেকে নির্বাচিত, যোগদান করা ইত্যাদির চিন্তাভাবনাগুলি বিনষ্ট করুন। এটি আপনার ডেটা যেভাবে সঞ্চয় করে তা নথি এবং সংগ্রহের আকারে রয়েছে যা আপনার স্টোরেজ অবস্থান থেকে ডেটা যুক্ত করার এবং অর্জন করার গতিশীল উপায়ের জন্য মঞ্জুরি দেয়।

বলা হচ্ছে, w আনইন্ড প্যারামিটারের পিছনের ধারণাটি বুঝতে, আপনাকে প্রথমে বুঝতে হবে যে আপনি যে ব্যবহারের ক্ষেত্রে উদ্ধৃতি দেওয়ার চেষ্টা করছেন সেটি কী বলছে। মংগডব.অর্গ.এর উদাহরণ নথিটি নিম্নরূপ:

{
 title : "this is my title" ,
 author : "bob" ,
 posted : new Date () ,
 pageViews : 5 ,
 tags : [ "fun" , "good" , "fun" ] ,
 comments : [
             { author :"joe" , text : "this is cool" } ,
             { author :"sam" , text : "this is bad" }
 ],
 other : { foo : 5 }
}

দেখুন কীভাবে ট্যাগগুলি আসলে 3 টি আইটেমের অ্যারে হয়, এই ক্ষেত্রে "মজাদার", "ভাল" এবং "মজাদার" হয়ে থাকে।

যা খুলে যায় তা আপনাকে প্রতিটি উপাদানগুলির জন্য একটি দস্তাবেজ ছাঁটাই করার অনুমতি দেয় এবং ফলস্বরূপ যে দস্তাবেজটি ফেরত দেয়। একটি শাস্ত্রীয় পদ্ধতির মধ্যে এটি ভাবতে, এটি "ট্যাগ অ্যারে প্রতিটি আইটেমের জন্য, কেবলমাত্র সেই আইটেমটি দিয়ে একটি ডকুমেন্ট ফেরত" এর সমতুল্য হবে।

সুতরাং, নিম্নলিখিত চালনার ফলাফল:

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);

নিম্নলিখিত নথিগুলি ফেরত দেবে:

{
     "result" : [
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "fun"
             },
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "good"
             },
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "fun"
             }
     ],
     "OK" : 1
}

লক্ষ্য করুন যে ফলাফলের অ্যারেতে পরিবর্তিত হওয়া একমাত্র জিনিসটি ট্যাগগুলির মানতে ফিরে আসছে। এটি কীভাবে কাজ করে তা সম্পর্কে আপনার যদি অতিরিক্ত রেফারেন্সের প্রয়োজন হয় তবে আমি এখানে একটি লিঙ্ক অন্তর্ভুক্ত করেছি । আশা করি এটি সহায়তা করে এবং আপনার প্রচারের জন্য শুভকামনা যেটি এখন পর্যন্ত আমি এসে পৌঁছেছি এমন সেরা নোএসকিউএল সিস্টেমগুলির মধ্যে একটিতে।


45

$unwind পাইপলাইনে প্রতিটি নথিকে নকল করে একবার অ্যারে উপাদান অনুসারে।

সুতরাং যদি আপনার ইনপুট পাইপলাইনে দুটি উপাদান সহ একটি নিবন্ধ ডক থাকে tags, {$unwind: '$tags'}তবে পাইপলাইনটি tagsক্ষেত্রটি বাদে দুটি নিবন্ধের ডক্সে রূপান্তরিত করবে । প্রথম দস্তাবেজে tagsমূল ডক এর অ্যারে থেকে প্রথম উপাদান থাকবে এবং দ্বিতীয় ডকটিতে tagsদ্বিতীয় উপাদান থাকবে।


23

আসুন এটি একটি উদাহরণ দিয়ে বুঝতে পারি

এই হল কিভাবে কোম্পানী দস্তাবেজের মত দেখায়:

মূল নথি

$unwindইনপুট একটি অ্যারের মূল্যবান ক্ষেত্র আছে এবং আউটপুট নথি উত্পাদন করে যে, সেখানে যেমন যে অ্যারের মধ্যে প্রতিটি উপাদান জন্য এক আউটপুট ডকুমেন্ট হিসেবে কাগজপত্র নিতে আমাদের পারেন। সূত্র

W উন্মোচনের মঞ্চ

সুতরাং আসুন আমরা আমাদের সংস্থাগুলির উদাহরণগুলিতে ফিরে যাই, এবং আনওয়াইন্ড পর্যায়গুলির ব্যবহারটি একবার দেখে নিই। এই ক্যোয়ারী:


db.companies.aggregate([
    { $match: {"funding_rounds.investments.financial_org.permalink": "greylock" } },
    { $project: {
        _id: 0,
        name: 1,
        amount: "$funding_rounds.raised_amount",
        year: "$funding_rounds.funded_year"
    } }
])

উভয় পরিমাণ এবং বছরের জন্য অ্যারে রয়েছে এমন নথি তৈরি করে।

প্রকল্প আউটপুট

কারণ আমরা তহবিল রাউন্ডের অ্যারেতে প্রতিটি উপাদানগুলির জন্য উত্থাপিত পরিমাণ এবং তহবিল বছর অ্যাক্সেস করছি। এটি ঠিক করার জন্য, আমরা এই সমষ্টি পাইপলাইনে আমাদের প্রকল্পের মঞ্চের আগে একটি আনইন্ডাইন্ড স্টেজকে অন্তর্ভুক্ত করতে পারি এবং এই বলে প্যারামিটারাইজ করতে পারি যে আমরা unwindতহবিলের রাউন্ডের অ্যারেটিতে যেতে চাই:


db.companies.aggregate([
    { $match: {"funding_rounds.investments.financial_org.permalink": "greylock" } },
    { $unwind: "$funding_rounds" },
    { $project: {
        _id: 0,
        name: 1,
        amount: "$funding_rounds.raised_amount",
        year: "$funding_rounds.funded_year"
    } }
])

আনপাইন্ডের পরবর্তী পর্যায়ে আউটপুট আউটপুট হিসাবে ইনপুট হিসাবে প্রাপ্তির চেয়ে বেশি প্রভাব রয়েছে

যদি আমরা funding_roundsঅ্যারের দিকে তাকাই তবে আমরা জানি যে প্রত্যেকের funding_roundsজন্য একটি raised_amountএবং একটি funded_yearক্ষেত্র রয়েছে। সুতরাং, unwindপ্রতিটি নথির জন্য যা funding_roundsঅ্যারের উপাদানগুলি আউটপুট নথি তৈরি করে produce এখন, এই উদাহরণে, আমাদের মানগুলি stringএস। তবে, অ্যারের উপাদানগুলির জন্য মূল্য ধরণের নির্বিশেষে, এই unwindপ্রতিটি মানের জন্য একটি আউটপুট নথি তৈরি করবে, যেমন প্রশ্নে ক্ষেত্রটি ঠিক সেই উপাদানটি ধারণ করবে। এর ক্ষেত্রে funding_rounds, সেই উপাদানটি funding_roundsপ্রতিটি দস্তাবেজের মান হিসাবে আমাদের projectপর্যায়ে চলে যাওয়ার জন্য এই ডকুমেন্টগুলির মধ্যে একটি হবে । ফলাফল, তারপরে এটি চালানোর পরে, এখন আমরা একটি amountএবং একটি পেতে পারি yearপ্রতিটি সংস্থার জন্য প্রতিটি তহবিল রাউন্ডের জন্য একটিআমাদের সংগ্রহে। এর অর্থ হ'ল আমাদের ম্যাচটি অনেকগুলি কোম্পানির নথি তৈরি করেছিল এবং সেই সংস্থাগুলির প্রত্যেকটির নথিই অনেকগুলি নথির ফলাফল। প্রতিটি কোম্পানির নথির মধ্যে প্রতিটি তহবিলের জন্য একটি। মঞ্চ unwindথেকে হস্তান্তরিত দস্তাবেজগুলি ব্যবহার করে এই অপারেশন সম্পাদন করে match। এবং প্রতিটি সংস্থার জন্য এই সমস্ত নথিগুলি projectমঞ্চে পৌঁছে দেওয়া হয় ।

খোলার আউটপুট

সুতরাং, সব কাগজপত্র যেখানে ঢালাইকর ছিল Greylock (কোয়েরি উদাহরণ হিসাবে) নথি একটি সংখ্যা বিভক্ত করা হবে, যে কোম্পানী যা ফিল্টার সাথে মিলে যায় জন্য তহবিল চক্রের সংখ্যার সমান $match: {"funding_rounds.investments.financial_org.permalink": "greylock" }। এবং ফলস্বরূপ নথিগুলির প্রত্যেকটি তারপরে আমাদের সাথে প্রেরণ করা হবে project। এখন, unwindপ্রতিটি ইনকাম হিসাবে প্রাপ্ত নথির প্রতিটিটির জন্য একটি অনুলিপি তৈরি করে। সমস্ত ক্ষেত্রের একটি ব্যতিক্রম ব্যতীত একই কী এবং মান রয়েছে এবং তা হ'ল funding_roundsক্ষেত্রটি funding_roundsনথির অ্যারে না হয়ে পরিবর্তে এর মান রয়েছে যা একটি একক নথি, যা স্বতন্ত্র তহবিলের গোল। সুতরাং, 4 টি তহবিল রাউন্ড রয়েছে এমন একটি সংস্থার ফলাফল 4unwind তৈরি হবেনথি। যেখানে ক্ষেত্র ব্যতীত প্রতিটি ক্ষেত্র হুবহু অনুলিপি হয়, funding_roundsযা প্রতিলিপিগুলির প্রতিটির জন্য একটি অ্যারের পরিবর্তে বর্তমানে প্রক্রিয়াকরণ করা funding_roundsসংস্থার ডকুমেন্টের অ্যারে থেকে পৃথক উপাদান হবে unwind। সুতরাং, unwindপরবর্তী পর্যায়ে আউটপুট আউটপুট হিসাবে ইনপুট হিসাবে প্রাপ্তির চেয়ে বেশি ডকুমেন্টের প্রভাব রয়েছে। এর অর্থ হ'ল আমাদের projectমঞ্চটি এখন funding_roundsএমন একটি ক্ষেত্র পেয়েছে যা আবার অ্যারে নয়, বরং এটি একটি নেস্টেড ডকুমেন্ট যা একটি raised_amountএবং funded_yearক্ষেত্র রয়েছে। সুতরাং, ফিল্টারটি ইনগ্রেড projectকরার জন্য প্রতিটি সংস্থার একাধিক নথি পাবেন matchএবং সেইজন্য প্রতিটি নথির স্বতন্ত্রভাবে প্রক্রিয়া করতে পারবেন এবং প্রতিটি সংস্থার জন্য প্রতিটি তহবিলের জন্য পৃথক পরিমাণ এবং বছর চিহ্নিত করতে পারবেন


4
একই ডকুমেন্ট ব্যবহার করা আরও ভাল হবে।
Jeb50

4
আনওয়াইন্ডের জন্য প্রথম ব্যবহারের কেস হিসাবে আমার নেস্টেড সেটগুলির সেটগুলি বেশ জটিল ছিল। মঙ্গো ডক্স এবং স্ট্যাকওয়ারফ্লোয়ের মধ্যে গিয়ে আপনার উত্তরটি আমাকে শেষ পর্যন্ত $ প্রকল্প এবং w আরও ভাল খুলে ফেলতে সহায়তা করেছে। ধন্যবাদ @ জামির!
সাত

3

মোংডব অফিশিয়াল ডকুমেন্টেশন অনুসারে:

w আনইন্ড উইন্ডো প্রতিটি উপাদানগুলির জন্য একটি নথির আউটপুট আউটপুট নথি থেকে একটি অ্যারের ক্ষেত্র ডিকনস্ট্রোজ করে। প্রতিটি আউটপুট নথি হ'ল উপাদান দ্বারা প্রতিস্থাপিত অ্যারে ক্ষেত্রের মান সহ ইনপুট নথি document

প্রাথমিক উদাহরণের মাধ্যমে ব্যাখ্যা:

একটি সংগ্রহের তালিকাতে নিম্নলিখিত নথি রয়েছে:

{ "_id" : 1, "item" : "ABC", "sizes": [ "S", "M", "L"] }
{ "_id" : 2, "item" : "EFG", "sizes" : [ ] }
{ "_id" : 3, "item" : "IJK", "sizes": "M" }
{ "_id" : 4, "item" : "LMN" }
{ "_id" : 5, "item" : "XYZ", "sizes" : null }

নিম্নলিখিত $ অনাইন্ড অপারেশনগুলি সমান এবং আকারের ক্ষেত্রের প্রতিটি উপাদানগুলির জন্য একটি নথি ফেরত দেয়। যদি আকারগুলির ক্ষেত্র কোনও অ্যারের সাথে সমাধান না করে তবে অনুপস্থিত, নাল, বা একটি খালি অ্যারে না থাকে $ আনইন্ডহাইন্ড অ-অ্যারে অপারেণ্ডকে একক উপাদান অ্যারের হিসাবে বিবেচনা করে।

db.inventory.aggregate( [ { $unwind: "$sizes" } ] )

বা

db.inventory.aggregate( [ { $unwind: { path: "$sizes" } } ] 

কোয়েরি আউটপুট উপরে:

{ "_id" : 1, "item" : "ABC", "sizes" : "S" }
{ "_id" : 1, "item" : "ABC", "sizes" : "M" }
{ "_id" : 1, "item" : "ABC", "sizes" : "L" }
{ "_id" : 3, "item" : "IJK", "sizes" : "M" }

কেন এটি প্রয়োজন?

w একত্রিত করার সময় আনওয়াইন্ড খুব দরকারী। এটি বিভিন্ন ক্রিয়াকলাপ বাছাই, অনুসন্ধান ইত্যাদির আগে জটিল / নেস্টেড ডকুমেন্টকে সাধারণ নথিতে বিভক্ত করে

W আনওয়াইন্ড সম্পর্কে আরও জানতে:

https://docs.mongodb.com/manual/references/operator/aggregation/unwind/

সমষ্টি সম্পর্কে আরও জানতে:

https://docs.mongodb.com/manual/references/operator/aggregation-pipline/


2

একটি সংগ্রহে এই ডেটা বুঝতে নীচের উদাহরণ বিবেচনা করুন

{
        "_id" : 1,
        "shirt" : "Half Sleeve",
        "sizes" : [
                "medium",
                "XL",
                "free"
        ]
}

ক্যোয়ারী - db.test1.aggregate ([[$ $ আনওয়াইন্ড: "$ মাপ"}]]);

আউটপুট

{ "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "medium" }
{ "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "XL" }
{ "_id" : 1, "shirt" : "Half Sleeve", "sizes" : "free" }

1

আমি আরডিবিএমএস উপায়ে কোর্টলেটেড উপায়ে ব্যাখ্যা করি। এটি বিবৃতি:

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);

নথি / রেকর্ডে প্রয়োগ করতে :

{
 title : "this is my title" ,
 author : "bob" ,
 posted : new Date () ,
 pageViews : 5 ,
 tags : [ "fun" , "good" , "fun" ] ,
 comments : [
             { author :"joe" , text : "this is cool" } ,
             { author :"sam" , text : "this is bad" }
 ],
 other : { foo : 5 }
}

$ প্রকল্প / নির্বাচন কেবল এই ক্ষেত্র / কলাম ফেরৎ

লেখক, শিরোনাম, নিবন্ধ থেকে ট্যাগ নির্বাচন করুন

এর পরে মঙ্গোর মজাদার অংশ, এই অ্যারেটিকে tags : [ "fun" , "good" , "fun" ]অন্য সম্পর্কিত সারণী হিসাবে বিবেচনা করুন (কোনও চেহারা / রেফারেন্স সারণী হতে পারে না কারণ মানগুলির মধ্যে কিছু সদৃশ রয়েছে) "ট্যাগ" named মনে রাখবেন SELECT সাধারণত জিনিসগুলিকে উল্লম্বভাবে উত্পাদন করে, সুতরাং "ট্যাগগুলি" আনইন্ডিং করে () উল্লম্বভাবে টেবিল "ট্যাগগুলিতে বিভক্ত করা হয়।

$ প্রকল্প + $ এর শেষ ফলাফলটি উন্মুক্ত করা: এখানে চিত্র বর্ণনা লিখুন

আউটপুটটি JSON এ অনুবাদ করুন:

{ "author": "bob", "title": "this is my title", "tags": "fun"},
{ "author": "bob", "title": "this is my title", "tags": "good"},
{ "author": "bob", "title": "this is my title", "tags": "fun"}

কারণ আমরা মঙ্গোকে "_id" ক্ষেত্রটি বাদ দিতে বলিনি, তাই এটি স্বয়ংক্রিয়ভাবে যুক্ত হয়েছে।

কীটি হ'ল এটি সমষ্টি সম্পাদন করতে টেবিলের মতো করা।


বা এটির ভাবনার আর একটি উপায় হ'ল ইউনিয়ন সমস্ত
জেবি 50
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.