আমি মঙ্গো শেলের মধ্যে থেকে কোনও ক্ষেত্রের ধরণটি পরিবর্তন করার চেষ্টা করছি।
আমি এটি করছি ...
db.meta.update(
{'fields.properties.default': { $type : 1 }},
{'fields.properties.default': { $type : 2 }}
)
কিন্তু এটি কাজ করছে না!
আমি মঙ্গো শেলের মধ্যে থেকে কোনও ক্ষেত্রের ধরণটি পরিবর্তন করার চেষ্টা করছি।
আমি এটি করছি ...
db.meta.update(
{'fields.properties.default': { $type : 1 }},
{'fields.properties.default': { $type : 2 }}
)
কিন্তু এটি কাজ করছে না!
উত্তর:
পরিবর্তন করার একমাত্র উপায় $type
ডেটা হ'ল ডেটাটির সঠিক আপডেট রয়েছে এমন ডেটাতে একটি আপডেট সম্পাদন করা।
এই ক্ষেত্রে, দেখে মনে হচ্ছে আপনি $type
1 (ডাবল) থেকে 2 (স্ট্রিং) এ পরিবর্তন করার চেষ্টা করছেন ।
সুতরাং সহজেই ডিবি থেকে দস্তাবেজটি লোড করুন, কাস্ট সম্পাদন করুন ( new String(x)
) এবং তারপরে আবার নথিটি সংরক্ষণ করুন।
আপনার যদি শেল থেকে প্রোগ্রামগতভাবে এবং সম্পূর্ণরূপে এটি করার দরকার হয় তবে আপনি find(...).forEach(function(x) {})
সিনট্যাক্সটি ব্যবহার করতে পারেন ।
নীচে দ্বিতীয় মন্তব্যের জবাবে। bad
সংগ্রহের একটি নম্বর থেকে ক্ষেত্রটি পরিবর্তন করুন foo
।
db.foo.find( { 'bad' : { $type : 1 } } ).forEach( function (x) {
x.bad = new String(x.bad); // convert field to string
db.foo.save(x);
});
new String(x.bad)
0-সূচি-আইটেম x.bad
মানের সাথে স্ট্রিংয়ের সংগ্রহ তৈরি করে । ""+x.bad
সাইমন দ্বারা বর্ণিত ভেরিয়েন্টটি পছন্দসই হিসাবে কাজ করে
db.questions.find({_id:{$type:16}}).forEach( function (x) { db.questions.remove({_id:x._id},true); x._id = ""+x._id; db.questions.save(x); });
স্ট্রিং ফিল্ডটি পূর্ণসংখ্যায় রূপান্তর করুন:
db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) {
obj.field-name = new NumberInt(obj.field-name);
db.db-name.save(obj);
});
পূর্ণসংখ্যা ক্ষেত্রটিকে স্ট্রিংয়ে রূপান্তর করুন:
db.db-name.find({field-name: {$exists: true}}).forEach(function(obj) {
obj.field-name = "" + obj.field-name;
db.db-name.save(obj);
});
NumberLong
হয় তবে এখানে হিসাবে ব্যবহার করুন:db.db-name.find({field-name : {$exists : true}}).forEach( function(obj) { obj.field-name = new NumberLong(obj.field-name); db.db-name.save(obj); } );
স্ট্রিং থেকে ইন রূপান্তরের জন্য।
db.my_collection.find().forEach( function(obj) {
obj.my_value= new NumberInt(obj.my_value);
db.my_collection.save(obj);
});
স্ট্রিং জন্য ডাবল রূপান্তর।
obj.my_value= parseInt(obj.my_value, 10);
ভাসার জন্য:
obj.my_value= parseFloat(obj.my_value);
radix
- ডেভেলপার.মোজিলা.আর.ইন.ইউএস
new NumberInt()
শুরু করা Mongo 4.2
, db.collection.update()
একত্রিত পাইপলাইন গ্রহণ করতে পারে, অবশেষে নিজস্ব মানের উপর ভিত্তি করে কোনও ক্ষেত্রের আপডেটের অনুমতি দেয়:
// { a: "45", b: "x" }
// { a: 53, b: "y" }
db.collection.update(
{ a : { $type: 1 } },
[{ $set: { a: { $toString: "$a" } } }],
{ multi: true }
)
// { a: "45", b: "x" }
// { a: "53", b: "y" }
প্রথম অংশটি { a : { $type: 1 } }
ম্যাচের ক্যোয়ারী:
"a"
স্ট্রিংয়ে রূপান্তর করতে চাই যখন এর মান দ্বিগুণ হয়, তাই এটি উপাদানগুলির সাথে মেলে যা "a"
প্রকারের1
(ডাবল)।দ্বিতীয় অংশটি [{ $set: { a: { $toString: "$a" } } }]
আপডেট সমষ্টি পাইপলাইন:
$set
একটি নতুন সমাহার অপারেটর (Mongo 4.2
) যা এই ক্ষেত্রে একটি ক্ষেত্র পরিবর্তন করে if"$set"
মান হিসাবে সহজেই পড়া যায়"a"
"$a"
"$toString"
।Mongo 4.2
নথিটি আপডেট করার সময় নিজেই তা উল্লেখ করতে সক্ষম হচ্ছেন : এর জন্য নতুন মান "a"
বিদ্যমান মানের উপর ভিত্তি করে"$a"
।"$toString"
যেটি একটি নতুন সমষ্টি অপারেটর চালু হয়েছে Mongo 4.0
।ভুলে যাবেন না { multi: true }
, অন্যথায় কেবল প্রথম ম্যাচের ডকুমেন্ট আপডেট করা হবে।
ডবল থেকে স্ট্রিং যদি আপনার কাস্ট না হয় তবে আপনি চালু বিভিন্ন রূপান্তর অপারেটার মধ্যে পছন্দ আছে Mongo 4.0
যেমন $toBool
, $toInt
...
এবং যদি আপনার লক্ষ্যযুক্ত ধরণের জন্য কোনও উত্সর্গীকৃত রূপান্তরকারী না থাকে তবে আপনি { $toString: "$a" }
একটি $convert
ক্রিয়াকলাপের সাথে প্রতিস্থাপন করতে পারেন : { $convert: { input: "$a", to: 2 } }
যেখানে এর সারণীতেto
এই মানটি পাওয়া যাবে :
db.collection.update(
{ a : { $type: 1 } },
[{ $set: { a: { $convert: { input: "$a", to: 2 } } } }],
{ multi: true }
)
db.collection.updateMany( { a : { $type: 1 } }, [{ $set: { a: { $toString: "$a" } } }] )
- এটি multi : true
ব্যবহার এড়ানো যায়updateMany
সমস্ত উত্তর এখন পর্যন্ত forEach এর কিছু সংস্করণ ব্যবহার করে সমস্ত সংগ্রহ উপাদানগুলির ক্লায়েন্ট-সাইডের উপরে পুনরাবৃত্তি করে।
তবে, আপনি মোট পাইপলাইন এবং আউট স্টেজ ব্যবহার করে মংগোডিবি'র সার্ভার-সাইড প্রসেসিংটি ব্যবহার করতে পারেন :
আউট স্টেজ পরমাণুভাবে নতুন সংগ্রহের ফলাফলের সাথে বিদ্যমান সংগ্রহকে প্রতিস্থাপন করে।
উদাহরণ:
db.documents.aggregate([
{
$project: {
_id: 1,
numberField: { $substr: ['$numberField', 0, -1] },
otherField: 1,
differentField: 1,
anotherfield: 1,
needolistAllFieldsHere: 1
},
},
{
$out: 'documents',
},
]);
স্ট্রিংয়ের ক্ষেত্রের ক্ষেত্রকে তারিখের ক্ষেত্রে রূপান্তর করতে, আপনাকে লুপের মধ্যে find()
পদ্ধতিটি ব্যবহার করে forEach()
পদ্ধতি দ্বারা ফিরে আসা কার্সারটি পুনরায় করা দরকার , ক্ষেত্রটিকে একটি ডেট অবজেক্টে রূপান্তর করতে হবে এবং তারপরে $set
অপারেটরটি ব্যবহার করে ক্ষেত্রটি আপডেট করতে হবে ।
আপনি বাল্ক আপডেটের জন্য বাল্ক এপিআই ব্যবহার করার সুবিধা নিন যা আপনি আরও ভাল পারফরম্যান্সের প্রস্তাব দিচ্ছেন আপনি 1000 বলার ব্যাচে সার্ভারে অপারেশনগুলি প্রেরণ করবেন যা আপনাকে সার্ভারে প্রতিটি অনুরোধ প্রেরণ না করে আপনাকে আরও ভাল পারফরম্যান্স দেয় যা প্রতিবারে একবার 1000 অনুরোধ।
নীচে এই পদ্ধতির প্রদর্শন করে, প্রথম উদাহরণটি মোংগোডিবি সংস্করণগুলিতে উপলব্ধ বাল্ক এপিআই ব্যবহার করে >= 2.6 and < 3.2
। এটি সংগ্রহের সমস্ত দস্তাবেজকে সমস্ত created_at
ক্ষেত্রকে তারিখের ক্ষেত্রে পরিবর্তন করে আপডেট করে:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var newDate = new Date(doc.created_at);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "created_at": newDate}
});
counter++;
if (counter % 1000 == 0) {
bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 1000 != 0) { bulk.execute(); }
পরবর্তী উদাহরণটি নতুন মঙ্গোডিবি সংস্করণে প্রযোজ্য 3.2
যা বাল্ক এপিআই-কে অবজ্ঞা করে এবং এপিএস ব্যবহার করে একটি নতুন সেট সরবরাহ করেছে bulkWrite()
:
var bulkOps = [];
db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var newDate = new Date(doc.created_at);
bulkOps.push(
{
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "created_at": newDate } }
}
}
);
})
db.collection.bulkWrite(bulkOps, { "ordered": true });
বিন্যাস তৈরি না করে ইন্ট 32 কে স্ট্রিংয়ে মোঙ্গোতে রূপান্তর করতে কেবল আপনার সংখ্যায় "" যুক্ত করুন :-)
db.foo.find( { 'mynum' : { $type : 16 } } ).forEach( function (x) {
x.mynum = x.mynum + ""; // convert int32 to string
db.foo.save(x);
});
মন্ডোডিবি-তে অবজেক্টের ধরণটি পরিবর্তন করতে আমাকে সত্যই কী সাহায্য করেছিল কেবলমাত্র এই সাধারণ লাইনটি, সম্ভবত এখানে উল্লেখ করার আগে ...:
db.Users.find({age: {$exists: true}}).forEach(function(obj) {
obj.age = new NumberInt(obj.age);
db.Users.save(obj);
});
ব্যবহারকারীরা আমার সংগ্রহ এবং বয়স হ'ল অবজেক্টটি যার পূর্ণসংখ্যার পরিবর্তে একটি স্ট্রিং ছিল (ইন্ট 32)।
আমাকে সংগ্রহের একাধিক ক্ষেত্রের ডেটাটাইপ পরিবর্তন করতে হবে, তাই নথি সংগ্রহের ক্ষেত্রে একাধিক ডেটা টাইপের পরিবর্তন করতে আমি নিম্নলিখিতটি ব্যবহার করেছি। একটি পুরানো প্রশ্নের উত্তর কিন্তু অন্যদের জন্য সহায়ক হতে পারে।
db.mycoll.find().forEach(function(obj) {
if (obj.hasOwnProperty('phone')) {
obj.phone = "" + obj.phone; // int or longint to string
}
if (obj.hasOwnProperty('field-name')) {
obj.field-name = new NumberInt(obj.field-name); //string to integer
}
if (obj.hasOwnProperty('cdate')) {
obj.cdate = new ISODate(obj.cdate); //string to Date
}
db.mycoll.save(obj);
});
You can easily convert the string data type to numerical data type.
Don't forget to change collectionName & FieldName.
for ex : CollectionNmae : Users & FieldName : Contactno.
এই কোয়েরি চেষ্টা করুন ..
db.collectionName.find().forEach( function (x) {
x.FieldName = parseInt(x.FieldName);
db.collectionName.save(x);
});
স্ট্রোক থেকে মঙ্গো অবজেক্টে ডেমো পরিবর্তনের ক্ষেত্রের প্রকার মঙ্গু ব্যবহার করুন
Post.find({}, {mid: 1,_id:1}).exec(function (err, doc) {
doc.map((item, key) => {
Post.findByIdAndUpdate({_id:item._id},{$set:{mid: mongoose.Types.ObjectId(item.mid)}}).exec((err,res)=>{
if(err) throw err;
reply(res);
});
});
});
মঙ্গো অবজেক্টআইড যেমন শৈলীর অন্য একটি উদাহরণ
সংখ্যা, স্ট্রিং, বুলিয়ান আশা করি উত্তরটি অন্য কাউকে সহায়তা করবে।
আমি রূপান্তরটি ভাসতে স্ট্রিংয়ের জন্য এই স্ক্রিপ্টটি মঙ্গোদব কনসোলে ব্যবহার করি ...
db.documents.find({ 'fwtweaeeba' : {$exists : true}}).forEach( function(obj) {
obj.fwtweaeeba = parseFloat( obj.fwtweaeeba );
db.documents.save(obj); } );
db.documents.find({ 'versions.0.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) {
obj.versions[0].content.fwtweaeeba = parseFloat( obj.versions[0].content.fwtweaeeba );
db.documents.save(obj); } );
db.documents.find({ 'versions.1.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) {
obj.versions[1].content.fwtweaeeba = parseFloat( obj.versions[1].content.fwtweaeeba );
db.documents.save(obj); } );
db.documents.find({ 'versions.2.content.fwtweaeeba' : {$exists : true}}).forEach( function(obj) {
obj.versions[2].content.fwtweaeeba = parseFloat( obj.versions[2].content.fwtweaeeba );
db.documents.save(obj); } );
এবং এটি পিএইচপি তে)))
foreach($db->documents->find(array("type" => "chair")) as $document){
$db->documents->update(
array('_id' => $document[_id]),
array(
'$set' => array(
'versions.0.content.axdducvoxb' => (float)$document['versions'][0]['content']['axdducvoxb'],
'versions.1.content.axdducvoxb' => (float)$document['versions'][1]['content']['axdducvoxb'],
'versions.2.content.axdducvoxb' => (float)$document['versions'][2]['content']['axdducvoxb'],
'axdducvoxb' => (float)$document['axdducvoxb']
)
),
array('$multi' => true)
);
}
আমার ক্ষেত্রে, আমি নিম্নলিখিত ব্যবহার করি
function updateToSting(){
var collection = "<COLLECTION-NAME>";
db.collection(collection).find().forEach(function(obj) {
db.collection(collection).updateOne({YOUR_CONDITIONAL_FIELD:obj.YOUR_CONDITIONAL_FIELD},{$set:{YOUR_FIELD:""+obj.YOUR_FIELD}});
});
}
toString
কিছু নথির ক্ষেত্রে থাকি, আমি তৈরি / ব্যবহার করেছি এমন একটি ছোট প্রোগ্রাম এখানে ।