আমি কীভাবে (মঙ্গোডিবিতে) একাধিক সংগ্রহের ডেটা এক সংগ্রহে একত্রিত করতে পারি?
আমি কি মানচিত্র-হ্রাস ব্যবহার করতে পারি এবং যদি তাই হয় তবে কীভাবে?
আমি একজন নবাগত হিসাবে আমি কিছু উদাহরণের প্রশংসা করব।
আমি কীভাবে (মঙ্গোডিবিতে) একাধিক সংগ্রহের ডেটা এক সংগ্রহে একত্রিত করতে পারি?
আমি কি মানচিত্র-হ্রাস ব্যবহার করতে পারি এবং যদি তাই হয় তবে কীভাবে?
আমি একজন নবাগত হিসাবে আমি কিছু উদাহরণের প্রশংসা করব।
উত্তর:
যদিও আপনি এই রিয়েল-টাইমটি করতে পারবেন না, আপনি মংগোডিবি 1.8+ মানচিত্র / হ্রাসে "হ্রাস" বিকল্পটি ব্যবহার করে একসাথে ডেটা একত্রিত করতে মানচিত্র-হ্রাস একাধিকবার চালাতে পারেন (দেখুন http://www.mongodb.org/ ডিসপ্লে / ডকস / ম্যাপ্রেডস # ম্যাপ্রেডস-আউটপুটপশনস )। উভয় সংগ্রহে আপনার কিছু কী থাকা দরকার যা আপনি _আইডি হিসাবে ব্যবহার করতে পারেন।
উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনার কাছে একটি users
সংগ্রহ এবং comments
সংগ্রহ রয়েছে এবং আপনার একটি নতুন সংগ্রহ থাকতে চান যাতে প্রতিটি মন্তব্যের জন্য কিছু ব্যবহারকারী ডেমোগ্রাফিক তথ্য রয়েছে।
ধরা যাক users
সংগ্রহের নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:
এবং তারপরে comments
সংগ্রহের নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:
আপনি এই মানচিত্রটি / হ্রাস করতে হবে:
var mapUsers, mapComments, reduce;
db.users_comments.remove();
// setup sample data - wouldn't actually use this in production
db.users.remove();
db.comments.remove();
db.users.save({firstName:"Rich",lastName:"S",gender:"M",country:"CA",age:"18"});
db.users.save({firstName:"Rob",lastName:"M",gender:"M",country:"US",age:"25"});
db.users.save({firstName:"Sarah",lastName:"T",gender:"F",country:"US",age:"13"});
var users = db.users.find();
db.comments.save({userId: users[0]._id, "comment": "Hey, what's up?", created: new ISODate()});
db.comments.save({userId: users[1]._id, "comment": "Not much", created: new ISODate()});
db.comments.save({userId: users[0]._id, "comment": "Cool", created: new ISODate()});
// end sample data setup
mapUsers = function() {
var values = {
country: this.country,
gender: this.gender,
age: this.age
};
emit(this._id, values);
};
mapComments = function() {
var values = {
commentId: this._id,
comment: this.comment,
created: this.created
};
emit(this.userId, values);
};
reduce = function(k, values) {
var result = {}, commentFields = {
"commentId": '',
"comment": '',
"created": ''
};
values.forEach(function(value) {
var field;
if ("comment" in value) {
if (!("comments" in result)) {
result.comments = [];
}
result.comments.push(value);
} else if ("comments" in value) {
if (!("comments" in result)) {
result.comments = [];
}
result.comments.push.apply(result.comments, value.comments);
}
for (field in value) {
if (value.hasOwnProperty(field) && !(field in commentFields)) {
result[field] = value[field];
}
}
});
return result;
};
db.users.mapReduce(mapUsers, reduce, {"out": {"reduce": "users_comments"}});
db.comments.mapReduce(mapComments, reduce, {"out": {"reduce": "users_comments"}});
db.users_comments.find().pretty(); // see the resulting collection
এই মুহুর্তে, আপনার কাছে একটি নতুন সংগ্রহ বলা users_comments
হবে যার মধ্যে মার্জড ডেটা রয়েছে এবং আপনি এখন এটি ব্যবহার করতে পারেন। এই হ্রাস সংগ্রহগুলি হ'ল _id
যা আপনার মানচিত্রের ক্রিয়াকলাপগুলিতে আপনি কীটি বেরিয়েছিলেন এবং তারপরে সমস্ত মানগুলি value
কী এর অভ্যন্তরীণ একটি সাব-অবজেক্ট - মানগুলি হ্রাস হওয়া নথির শীর্ষ স্তরে নয়।
এটি কিছুটা সহজ উদাহরণ। আপনি হ্রাস সংগ্রহটি আরও বাড়িয়ে তুলতে চাইলে আরও সংগ্রহের সাথে এটি পুনরাবৃত্তি করতে পারেন। প্রক্রিয়াটিতে আপনি সংক্ষিপ্তসার এবং ডেটা একত্রিত করতে পারেন। বিদ্যমান ক্ষেত্রগুলিকে একত্রিত ও সংরক্ষণের জন্য যুক্তি আরও জটিল হয়ে যাওয়ার কারণে আপনি একাধিক ফাংশন হ্রাসের সংজ্ঞা দিবেন।
আপনি আরও লক্ষ করতে পারেন যে অ্যারেতে ব্যবহারকারীর সমস্ত মন্তব্য সহ প্রতিটি ব্যবহারকারীর জন্য এখন একটি নথি রয়েছে। যদি আমরা ডেটা মার্জ করে থাকি যা একের সাথে একের চেয়ে অনেকের মধ্যে এক-একের সম্পর্ক থাকে তবে এটি সমতল হবে এবং আপনি কেবল এই জাতীয়ভাবে হ্রাসকরণের ক্রিয়াটি ব্যবহার করতে পারেন:
reduce = function(k, values) {
var result = {};
values.forEach(function(value) {
var field;
for (field in value) {
if (value.hasOwnProperty(field)) {
result[field] = value[field];
}
}
});
return result;
};
আপনি যদি users_comments
সংগ্রহটি চ্যাপ্টা করতে চান তবে এটি মন্তব্যের জন্য একটি ডকুমেন্ট, অতিরিক্তভাবে এটি চালান:
var map, reduce;
map = function() {
var debug = function(value) {
var field;
for (field in value) {
print(field + ": " + value[field]);
}
};
debug(this);
var that = this;
if ("comments" in this.value) {
this.value.comments.forEach(function(value) {
emit(value.commentId, {
userId: that._id,
country: that.value.country,
age: that.value.age,
comment: value.comment,
created: value.created,
});
});
}
};
reduce = function(k, values) {
var result = {};
values.forEach(function(value) {
var field;
for (field in value) {
if (value.hasOwnProperty(field)) {
result[field] = value[field];
}
}
});
return result;
};
db.users_comments.mapReduce(map, reduce, {"out": "comments_with_demographics"});
এই কৌশলটি অবশ্যই উড়ে যাওয়া উচিত নয়। এটি ক্রোন চাকরির মতো বা এমন কোনও কিছুর জন্য উপযুক্ত যা মেশানো ডেটা পর্যায়ক্রমে আপডেট করে। আপনি সম্ভবত ensureIndex
এই সংগ্রহের বিরুদ্ধে আপনি যে অনুসন্ধানগুলি করেছেন তা নিশ্চিত করার জন্য আপনি নতুন সংগ্রহটি চালিয়ে যেতে চাইবেন (মনে রাখবেন যে আপনার ডেটা এখনও একটি value
চাবির মধ্যে রয়েছে তাই comments_with_demographics
মন্তব্যটির created
সময় যদি আপনি সূচী হয়ে থাকেন তবে এটি হবেdb.comments_with_demographics.ensureIndex({"value.created": 1});
users_comments
জন্য এফওয়াইআই, gist.github.com/nolanamy/83d7fb6a9bf92482a1c4311ad9c78835
মঙ্গোডিবি ৩.২ এখন একজনকে একাধিক সংগ্রহ থেকে ডেটা একত্রিত করার অনুমতি দেয় $ লুকিং অগ্রিগেশন পর্যায়ে । ব্যবহারিক উদাহরণ হিসাবে, আসুন আমরা বলতে পারি যে আপনার কাছে বইগুলি সম্পর্কিত দুটি তথ্য দুটি পৃথক সংকলনে বিভক্ত।
books
নিম্নলিখিত সংগ্রহ সহ প্রথম সংগ্রহ, বলা হচ্ছে:
{
"isbn": "978-3-16-148410-0",
"title": "Some cool book",
"author": "John Doe"
}
{
"isbn": "978-3-16-148999-9",
"title": "Another awesome book",
"author": "Jane Roe"
}
এবং দ্বিতীয় সংকলন, যার books_selling_data
মধ্যে নিম্নলিখিত ডেটা রয়েছে:
{
"_id": ObjectId("56e31bcf76cdf52e541d9d26"),
"isbn": "978-3-16-148410-0",
"copies_sold": 12500
}
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 720050
}
{
"_id": ObjectId("56e31ce076cdf52e541d9d29"),
"isbn": "978-3-16-148999-9",
"copies_sold": 1000
}
উভয় সংগ্রহকে একত্রিত করা কেবলমাত্র নিম্নলিখিত পদ্ধতিতে $ দেখার জন্য বিষয়:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
এই সংগ্রহের পরে, books
সংগ্রহটি নিম্নলিখিতগুলির মতো দেখাবে:
{
"isbn": "978-3-16-148410-0",
"title": "Some cool book",
"author": "John Doe",
"copies_sold": [
{
"_id": ObjectId("56e31bcf76cdf52e541d9d26"),
"isbn": "978-3-16-148410-0",
"copies_sold": 12500
}
]
}
{
"isbn": "978-3-16-148999-9",
"title": "Another awesome book",
"author": "Jane Roe",
"copies_sold": [
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 720050
},
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 1000
}
]
}
কয়েকটি বিষয় লক্ষ্য করা গুরুত্বপূর্ণ:
books_selling_data
তীক্ষ্ণ করা যায় না।সুতরাং, উপসংহার হিসাবে, যদি আপনি উভয় সংগ্রহকে একত্রীকরণ করতে চান, এই ক্ষেত্রে মোট বিক্রয়কৃত অনুলিপি সহ একটি সমতল অনুলিপি বিক্রয় ক্ষেত্র, আপনাকে আরও কিছুটা কাজ করতে হবে, সম্ভবত কোনও মধ্যস্থতাকারী সংগ্রহ ব্যবহার করে, তারপর, হতে $ আউট চূড়ান্ত সংগ্রহে।
$lookup
সমস্ত "লোকালফিল্ড" এবং "বিদেশী ফিল্ড" সমান "ইসবিএন" হওয়া উচিত নয়? "_আইডি" এবং "ইসবিএন" নয়?
যদি মংডোবগুলিতে কোনও বাল্ক isোকানো না থাকে তবে আমরা সমস্ত বস্তু লুপ করি এবং সেগুলির মধ্যে small_collection
একটি করে একটি প্রবেশ করান big_collection
:
db.small_collection.find().forEach(function(obj){
db.big_collection.insert(obj)
});
$ দর্শন সহ খুব বুনিয়াদী উদাহরণ।
db.getCollection('users').aggregate([
{
$lookup: {
from: "userinfo",
localField: "userId",
foreignField: "userId",
as: "userInfoData"
}
},
{
$lookup: {
from: "userrole",
localField: "userId",
foreignField: "userId",
as: "userRoleData"
}
},
{ $unwind: { path: "$userInfoData", preserveNullAndEmptyArrays: true }},
{ $unwind: { path: "$userRoleData", preserveNullAndEmptyArrays: true }}
])
এখানে ব্যবহৃত হয়
{ $unwind: { path: "$userInfoData", preserveNullAndEmptyArrays: true }},
{ $unwind: { path: "$userRoleData", preserveNullAndEmptyArrays: true }}
পরিবর্তে
{ $unwind:"$userRoleData"}
{ $unwind:"$userRoleData"}
কারণ $ w আনওয়াইন্ড: "$ ইউজাররোলডেটা"} empty লুকিংয়ের সাথে কোনও মিলের রেকর্ড না পাওয়া গেলে এটি খালি বা 0 ফলাফল ফিরে আসবে।
একটি 'এসকিউএল ইউনিয়ন' ফ্যাশনে মংগোডিবিতে ইউনিয়নগুলি করা একক ক্যোয়ারিতে লুকআপের পাশাপাশি সমষ্টিগুলি ব্যবহার করা সম্ভব। এখানে আমি উদাহরণ দিয়ে দেখেছি যা মঙ্গোডিবি ৪.০ এর সাথে কাজ করে:
// Create employees data for testing the union.
db.getCollection('employees').insert({ name: "John", type: "employee", department: "sales" });
db.getCollection('employees').insert({ name: "Martha", type: "employee", department: "accounting" });
db.getCollection('employees').insert({ name: "Amy", type: "employee", department: "warehouse" });
db.getCollection('employees').insert({ name: "Mike", type: "employee", department: "warehouse" });
// Create freelancers data for testing the union.
db.getCollection('freelancers').insert({ name: "Stephany", type: "freelancer", department: "accounting" });
db.getCollection('freelancers').insert({ name: "Martin", type: "freelancer", department: "sales" });
db.getCollection('freelancers').insert({ name: "Doug", type: "freelancer", department: "warehouse" });
db.getCollection('freelancers').insert({ name: "Brenda", type: "freelancer", department: "sales" });
// Here we do a union of the employees and freelancers using a single aggregation query.
db.getCollection('freelancers').aggregate( // 1. Use any collection containing at least one document.
[
{ $limit: 1 }, // 2. Keep only one document of the collection.
{ $project: { _id: '$$REMOVE' } }, // 3. Remove everything from the document.
// 4. Lookup collections to union together.
{ $lookup: { from: 'employees', pipeline: [{ $match: { department: 'sales' } }], as: 'employees' } },
{ $lookup: { from: 'freelancers', pipeline: [{ $match: { department: 'sales' } }], as: 'freelancers' } },
// 5. Union the collections together with a projection.
{ $project: { union: { $concatArrays: ["$employees", "$freelancers"] } } },
// 6. Unwind and replace root so you end up with a result set.
{ $unwind: '$union' },
{ $replaceRoot: { newRoot: '$union' } }
]);
এটি কীভাবে কাজ করে তার ব্যাখ্যা এখানে:
আপনার ডাটাবেসের যে কোনও সংকলনের মধ্যে কমপক্ষে একটি ডকুমেন্ট রয়েছে তার aggregate
বাইরে ইনস্টল করুন । যদি আপনি গ্যারান্টি দিতে না পারেন যে আপনার ডাটাবেসের কোনও সংগ্রহ খালি না থেকে থাকে, আপনি আপনার ডাটাবেসে কোনও ধরণের 'ডামি' সংগ্রহ তৈরি করে এটিতে একক খালি নথি যা বিশেষত ইউনিয়ন কোয়েরি করার জন্য থাকবে তা সমাধান করতে পারেন।
আপনার পাইপলাইনটি প্রথম পর্যায়ে পরিণত করুন { $limit: 1 }
। এটি প্রথমটি বাদে সংগ্রহের সমস্ত নথি ছড়িয়ে দেবে।
এটিকে ব্যবহার করে বাকী নথির সমস্ত ক্ষেত্র স্ট্রিপ করুন $project
স্টেজ :
{ $project: { _id: '$$REMOVE' } }
আপনার সামগ্রীতে এখন একটি একক, খালি দস্তাবেজ রয়েছে। আপনি একসাথে ইউনিয়ন করতে চান এমন প্রতিটি সংগ্রহের জন্য অনুসন্ধানগুলি যুক্ত করার সময়। আপনি pipeline
নির্দিষ্ট ফিল্টারিং করতে ক্ষেত্রটি ব্যবহার করতে পারেন , বা ছেড়ে যান localField
এবংforeignField
পুরো সংগ্রহের সাথে মেলে নাল হিসাবে।
{ $lookup: { from: 'collectionToUnion1', pipeline: [...], as: 'Collection1' } },
{ $lookup: { from: 'collectionToUnion2', pipeline: [...], as: 'Collection2' } },
{ $lookup: { from: 'collectionToUnion3', pipeline: [...], as: 'Collection3' } }
আপনার কাছে এখন একটি একক দস্তাবেজ সমন্বিত রয়েছে যাতে এতে 3 টি অ্যারে থাকে:
{
Collection1: [...],
Collection2: [...],
Collection3: [...]
}
তারপরে আপনি এগ্রিগেশন অপারেটরের $project
সাথে একটি মঞ্চ ব্যবহার করে তাদের একত্রে অ্যারেতে একত্রে মার্জ করতে পারেন $concatArrays
:
{
"$project" :
{
"Union" : { $concatArrays: ["$Collection1", "$Collection2", "$Collection3"] }
}
}
এখন আপনার কাছে একটি একক দস্তাবেজ সমন্বিত রয়েছে, এতে একটি সংগ্রহস্থল রয়েছে যা আপনার সংগ্রহের ইউনিয়ন ধারণ করে। যা করা বাকি তা হ'ল আপনার অ্যারেটিকে পৃথক নথিতে বিভক্ত করার জন্য একটি $unwind
এবং একটি $replaceRoot
মঞ্চ যুক্ত করা:
{ $unwind: "$Union" },
{ $replaceRoot: { newRoot: "$Union" } }
Voila। আপনি এখন একসাথে একত্রিত করতে চেয়েছিলেন এমন সংগ্রহগুলি সহ একটি ফলাফল সেট রয়েছে। এরপরে আপনি এটিকে আরও ফিল্টার করতে আরও ধাপ যুক্ত করতে পারেন, এটি বাছাই করতে পারেন, স্কিপ প্রয়োগ করুন () এবং সীমাবদ্ধ করুন ()। আপনি চান অনেক সুন্দর।
একত্রে একাধিক সংগ্রহের জন্য একাধিক $ অনুসন্ধান ব্যবহার করুন
প্রশ্ন:
db.getCollection('servicelocations').aggregate([
{
$match: {
serviceLocationId: {
$in: ["36728"]
}
}
},
{
$lookup: {
from: "orders",
localField: "serviceLocationId",
foreignField: "serviceLocationId",
as: "orders"
}
},
{
$lookup: {
from: "timewindowtypes",
localField: "timeWindow.timeWindowTypeId",
foreignField: "timeWindowTypeId",
as: "timeWindow"
}
},
{
$lookup: {
from: "servicetimetypes",
localField: "serviceTimeTypeId",
foreignField: "serviceTimeTypeId",
as: "serviceTime"
}
},
{
$unwind: "$orders"
},
{
$unwind: "$serviceTime"
},
{
$limit: 14
}
])
ফলাফল:
{
"_id" : ObjectId("59c3ac4bb7799c90ebb3279b"),
"serviceLocationId" : "36728",
"regionId" : 1.0,
"zoneId" : "DXBZONE1",
"description" : "AL HALLAB REST EMIRATES MALL",
"locationPriority" : 1.0,
"accountTypeId" : 1.0,
"locationType" : "SERVICELOCATION",
"location" : {
"makani" : "",
"lat" : 25.119035,
"lng" : 55.198694
},
"deliveryDays" : "MTWRFSU",
"timeWindow" : [
{
"_id" : ObjectId("59c3b0a3b7799c90ebb32cde"),
"timeWindowTypeId" : "1",
"Description" : "MORNING",
"timeWindow" : {
"openTime" : "06:00",
"closeTime" : "08:00"
},
"accountId" : 1.0
},
{
"_id" : ObjectId("59c3b0a3b7799c90ebb32cdf"),
"timeWindowTypeId" : "1",
"Description" : "MORNING",
"timeWindow" : {
"openTime" : "09:00",
"closeTime" : "10:00"
},
"accountId" : 1.0
},
{
"_id" : ObjectId("59c3b0a3b7799c90ebb32ce0"),
"timeWindowTypeId" : "1",
"Description" : "MORNING",
"timeWindow" : {
"openTime" : "10:30",
"closeTime" : "11:30"
},
"accountId" : 1.0
}
],
"address1" : "",
"address2" : "",
"phone" : "",
"city" : "",
"county" : "",
"state" : "",
"country" : "",
"zipcode" : "",
"imageUrl" : "",
"contact" : {
"name" : "",
"email" : ""
},
"status" : "ACTIVE",
"createdBy" : "",
"updatedBy" : "",
"updateDate" : "",
"accountId" : 1.0,
"serviceTimeTypeId" : "1",
"orders" : [
{
"_id" : ObjectId("59c3b291f251c77f15790f92"),
"orderId" : "AQ18O1704264",
"serviceLocationId" : "36728",
"orderNo" : "AQ18O1704264",
"orderDate" : "18-Sep-17",
"description" : "AQ18O1704264",
"serviceType" : "Delivery",
"orderSource" : "Import",
"takenBy" : "KARIM",
"plannedDeliveryDate" : ISODate("2017-08-26T00:00:00.000Z"),
"plannedDeliveryTime" : "",
"actualDeliveryDate" : "",
"actualDeliveryTime" : "",
"deliveredBy" : "",
"size1" : 296.0,
"size2" : 3573.355,
"size3" : 240.811,
"jobPriority" : 1.0,
"cancelReason" : "",
"cancelDate" : "",
"cancelBy" : "",
"reasonCode" : "",
"reasonText" : "",
"status" : "",
"lineItems" : [
{
"ItemId" : "BNWB020",
"size1" : 15.0,
"size2" : 78.6,
"size3" : 6.0
},
{
"ItemId" : "BNWB021",
"size1" : 20.0,
"size2" : 252.0,
"size3" : 11.538
},
{
"ItemId" : "BNWB023",
"size1" : 15.0,
"size2" : 285.0,
"size3" : 16.071
},
{
"ItemId" : "CPMW112",
"size1" : 3.0,
"size2" : 25.38,
"size3" : 1.731
},
{
"ItemId" : "MMGW001",
"size1" : 25.0,
"size2" : 464.375,
"size3" : 46.875
},
{
"ItemId" : "MMNB218",
"size1" : 50.0,
"size2" : 920.0,
"size3" : 60.0
},
{
"ItemId" : "MMNB219",
"size1" : 50.0,
"size2" : 630.0,
"size3" : 40.0
},
{
"ItemId" : "MMNB220",
"size1" : 50.0,
"size2" : 416.0,
"size3" : 28.846
},
{
"ItemId" : "MMNB270",
"size1" : 50.0,
"size2" : 262.0,
"size3" : 20.0
},
{
"ItemId" : "MMNB302",
"size1" : 15.0,
"size2" : 195.0,
"size3" : 6.0
},
{
"ItemId" : "MMNB373",
"size1" : 3.0,
"size2" : 45.0,
"size3" : 3.75
}
],
"accountId" : 1.0
},
{
"_id" : ObjectId("59c3b291f251c77f15790f9d"),
"orderId" : "AQ137O1701240",
"serviceLocationId" : "36728",
"orderNo" : "AQ137O1701240",
"orderDate" : "18-Sep-17",
"description" : "AQ137O1701240",
"serviceType" : "Delivery",
"orderSource" : "Import",
"takenBy" : "KARIM",
"plannedDeliveryDate" : ISODate("2017-08-26T00:00:00.000Z"),
"plannedDeliveryTime" : "",
"actualDeliveryDate" : "",
"actualDeliveryTime" : "",
"deliveredBy" : "",
"size1" : 28.0,
"size2" : 520.11,
"size3" : 52.5,
"jobPriority" : 1.0,
"cancelReason" : "",
"cancelDate" : "",
"cancelBy" : "",
"reasonCode" : "",
"reasonText" : "",
"status" : "",
"lineItems" : [
{
"ItemId" : "MMGW001",
"size1" : 25.0,
"size2" : 464.38,
"size3" : 46.875
},
{
"ItemId" : "MMGW001-F1",
"size1" : 3.0,
"size2" : 55.73,
"size3" : 5.625
}
],
"accountId" : 1.0
},
{
"_id" : ObjectId("59c3b291f251c77f15790fd8"),
"orderId" : "AQ110O1705036",
"serviceLocationId" : "36728",
"orderNo" : "AQ110O1705036",
"orderDate" : "18-Sep-17",
"description" : "AQ110O1705036",
"serviceType" : "Delivery",
"orderSource" : "Import",
"takenBy" : "KARIM",
"plannedDeliveryDate" : ISODate("2017-08-26T00:00:00.000Z"),
"plannedDeliveryTime" : "",
"actualDeliveryDate" : "",
"actualDeliveryTime" : "",
"deliveredBy" : "",
"size1" : 60.0,
"size2" : 1046.0,
"size3" : 68.0,
"jobPriority" : 1.0,
"cancelReason" : "",
"cancelDate" : "",
"cancelBy" : "",
"reasonCode" : "",
"reasonText" : "",
"status" : "",
"lineItems" : [
{
"ItemId" : "MMNB218",
"size1" : 50.0,
"size2" : 920.0,
"size3" : 60.0
},
{
"ItemId" : "MMNB219",
"size1" : 10.0,
"size2" : 126.0,
"size3" : 8.0
}
],
"accountId" : 1.0
}
],
"serviceTime" : {
"_id" : ObjectId("59c3b07cb7799c90ebb32cdc"),
"serviceTimeTypeId" : "1",
"serviceTimeType" : "nohelper",
"description" : "",
"fixedTime" : 30.0,
"variableTime" : 0.0,
"accountId" : 1.0
}
}
ডেটাবেজে ইতিমধ্যে যা আছে তার উপরে মংগেরস্টোরের বৈশিষ্ট্য রয়েছে, সুতরাং এই আচরণটি দুটি সংগ্রহের সংমিশ্রণের জন্য ব্যবহার করা যেতে পারে:
এটি এখনও চেষ্টা করে দেখেনি, তবে এটি মানচিত্রের চেয়ে দ্রুত সম্পাদন / পদ্ধতির হ্রাস পেতে পারে।
শুরু করে Mongo 4.4
, আমরা নতুন সংযোজন $unionWith
পর্যায়ে $group
এর নতুন $accumulator
অপারেটরের সাথে মিলিত করে একত্রিতকরণ পাইপলাইনের মধ্যে এই যোগদানটি অর্জন করতে পারি :
// > db.users.find()
// [{ user: 1, name: "x" }, { user: 2, name: "y" }]
// > db.books.find()
// [{ user: 1, book: "a" }, { user: 1, book: "b" }, { user: 2, book: "c" }]
// > db.movies.find()
// [{ user: 1, movie: "g" }, { user: 2, movie: "h" }, { user: 2, movie: "i" }]
db.users.aggregate([
{ $unionWith: "books" },
{ $unionWith: "movies" },
{ $group: {
_id: "$user",
user: {
$accumulator: {
accumulateArgs: ["$name", "$book", "$movie"],
init: function() { return { books: [], movies: [] } },
accumulate: function(user, name, book, movie) {
if (name) user.name = name;
if (book) user.books.push(book);
if (movie) user.movies.push(movie);
return user;
},
merge: function(userV1, userV2) {
if (userV2.name) userV1.name = userV2.name;
userV1.books.concat(userV2.books);
userV1.movies.concat(userV2.movies);
return userV1;
},
lang: "js"
}
}
}}
])
// { _id: 1, user: { books: ["a", "b"], movies: ["g"], name: "x" } }
// { _id: 2, user: { books: ["c"], movies: ["h", "i"], name: "y" } }
$unionWith
ইতিমধ্যে সমষ্টি পাইপলাইনে নথিগুলির মধ্যে প্রদত্ত সংগ্রহ থেকে রেকর্ড একত্রিত করে। 2 ইউনিয়ন পর্যায়ের পরে, আমরা পাইপলাইনের মধ্যে এইভাবে সমস্ত ব্যবহারকারী, বই এবং চলচ্চিত্রের রেকর্ড রাখি।
এরপরে আমরা অপারেটরটিকে দলবদ্ধ হওয়ার সাথে সাথে নথিগুলির কাস্টম সংশ্লেষের অনুমতি দিয়ে আইটেমগুলি $group
দ্বারা রেকর্ড $user
এবং জমা করি $accumulator
:
accumulateArgs
।init
রাষ্ট্রটিকে সংজ্ঞায়িত করা হয় যা আমরা উপাদানগুলির গ্রুপ হিসাবে সঞ্চিত হবে।accumulate
ফাংশন করণ পারবেন একটি রেকর্ড দিয়ে একটি কাস্টম কর্ম অর্ডার জমা রাষ্ট্র গড়ে তুলতে গোষ্ঠীবদ্ধ করা হচ্ছে। উদাহরণস্বরূপ, গোষ্ঠীভুক্ত আইটেমটির book
ক্ষেত্রটি যদি সংজ্ঞায়িত করা থাকে তবে আমরা books
রাজ্যের অংশটি আপডেট করি ।merge
দুটি অভ্যন্তরীণ রাজ্যের একত্রিত করতে ব্যবহৃত হয়। এটি কেবল তীক্ষ্ণ ক্লাস্টারগুলিতে চলমান সমাহারগুলির জন্য বা অপারেশন মেমরির সীমা ছাড়িয়ে গেলে ব্যবহৃত হয়।হ্যাঁ আপনি করতে পারেন: আমি আজ লিখেছি যে এই ইউটিলিটি ফাংশন নিন:
function shangMergeCol() {
tcol= db.getCollection(arguments[0]);
for (var i=1; i<arguments.length; i++){
scol= db.getCollection(arguments[i]);
scol.find().forEach(
function (d) {
tcol.insert(d);
}
)
}
}
আপনি যে কোনও সংখ্যক সংগ্রহ এই ফাংশনে পাস করতে পারেন, প্রথমটি লক্ষ্যটিকে এক হতে চলেছে। বাকি সমস্ত সংগ্রহগুলি লক্ষ্যটিকে স্থানান্তরিত করার উত্স।
টুকিটাকি সংকেতলিপি. এই সহ একটি স্ট্যাক ওভারফ্লোতে সৌজন্যে-একাধিক পোস্ট।
db.cust.drop();
db.zip.drop();
db.cust.insert({cust_id:1, zip_id: 101});
db.cust.insert({cust_id:2, zip_id: 101});
db.cust.insert({cust_id:3, zip_id: 101});
db.cust.insert({cust_id:4, zip_id: 102});
db.cust.insert({cust_id:5, zip_id: 102});
db.zip.insert({zip_id:101, zip_cd:'AAA'});
db.zip.insert({zip_id:102, zip_cd:'BBB'});
db.zip.insert({zip_id:103, zip_cd:'CCC'});
mapCust = function() {
var values = {
cust_id: this.cust_id
};
emit(this.zip_id, values);
};
mapZip = function() {
var values = {
zip_cd: this.zip_cd
};
emit(this.zip_id, values);
};
reduceCustZip = function(k, values) {
var result = {};
values.forEach(function(value) {
var field;
if ("cust_id" in value) {
if (!("cust_ids" in result)) {
result.cust_ids = [];
}
result.cust_ids.push(value);
} else {
for (field in value) {
if (value.hasOwnProperty(field) ) {
result[field] = value[field];
}
};
}
});
return result;
};
db.cust_zip.drop();
db.cust.mapReduce(mapCust, reduceCustZip, {"out": {"reduce": "cust_zip"}});
db.zip.mapReduce(mapZip, reduceCustZip, {"out": {"reduce": "cust_zip"}});
db.cust_zip.find();
mapCZ = function() {
var that = this;
if ("cust_ids" in this.value) {
this.value.cust_ids.forEach(function(value) {
emit(value.cust_id, {
zip_id: that._id,
zip_cd: that.value.zip_cd
});
});
}
};
reduceCZ = function(k, values) {
var result = {};
values.forEach(function(value) {
var field;
for (field in value) {
if (value.hasOwnProperty(field)) {
result[field] = value[field];
}
}
});
return result;
};
db.cust_zip_joined.drop();
db.cust_zip.mapReduce(mapCZ, reduceCZ, {"out": "cust_zip_joined"});
db.cust_zip_joined.find().pretty();
var flattenMRCollection=function(dbName,collectionName) {
var collection=db.getSiblingDB(dbName)[collectionName];
var i=0;
var bulk=collection.initializeUnorderedBulkOp();
collection.find({ value: { $exists: true } }).addOption(16).forEach(function(result) {
print((++i));
//collection.update({_id: result._id},result.value);
bulk.find({_id: result._id}).replaceOne(result.value);
if(i%1000==0)
{
print("Executing bulk...");
bulk.execute();
bulk=collection.initializeUnorderedBulkOp();
}
});
bulk.execute();
};
flattenMRCollection("mydb","cust_zip_joined");
db.cust_zip_joined.find().pretty();
আপনার অ্যাপ্লিকেশন স্তরে এটি করতে হবে। আপনি যদি একটি ওআরএম ব্যবহার করে থাকেন তবে এটি অন্যান্য সংগ্রহগুলিতে বিদ্যমান রেফারেন্সগুলি টানতে টীকাগুলি (বা অনুরূপ কিছু) ব্যবহার করতে পারে। আমি কেবল মরফিয়ার সাথে কাজ করেছি , এবং @Reference
জিজ্ঞাসা করা হলে টীকাগুলি রেফারেন্সড সত্তাটি নিয়ে আসে, তাই আমি কোডে এটি নিজেই করা এড়াতে সক্ষম হয়েছি।
db.collection1.find().forEach(function(doc){db.collection2.save(doc)});
এটি যথেষ্ট। আপনি যদি মঙ্গো শেল ব্যবহার না করেন তবে দয়া করে আপনার ব্যবহৃত ড্রাইভার (জাভা, পিএইচপি, ...) নির্দিষ্ট করুন।