কী নামে মঙ্গোডিবি ডট (।)


94

মনে হচ্ছে মঙ্গো কোনও বিন্দু (।) বা ডলার চিহ্ন ($) দিয়ে কী সন্নিবেশের অনুমতি দেয় না তবে আমি যখন কোনও JSON ফাইল আমদানি করেছিলাম যেখানে মঙ্গোইম্পোর্ট সরঞ্জামটি ব্যবহার করে এটি কাজ করে। ড্রাইভার সেই উপাদানটি sertোকানোর চেষ্টা করছে বলে অভিযোগ করছে।

ডাটাবেসটিতে নথিটি দেখতে এটির মতো:

{
    "_id": {
        "$oid": "..."
    },
    "make": "saab",
    "models": {
        "9.7x": [
            2007,
            2008,
            2009,
            2010
        ]
    }
}

আমি কি এই সব ভুল করছি এবং বাহ্যিক ডেটা (অর্থাত্ মডেলগুলি) দিয়ে হ্যাশ মানচিত্র ব্যবহার করা উচিত নয় বা আমি কোনওভাবে বিন্দু থেকে বাঁচতে পারি? আমি খুব বেশি জাভাস্ক্রিপ্টের মতো ভাবছি।


মূল্য খুঁজছেন, npmjs.com/package/mongo-escape
স্যাম দন্তি

উত্তর:


85

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

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


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

8
এই পরিস্থিতিতে আবার দৌড়ে। এটি অ্যাপ্লিকেশন কী নামগুলির সাথে এতটা না ঘটেছিল বলে মনে হয়, যা আমরা নিয়ন্ত্রণ করতে পারি এবং প্রায়শই জিজ্ঞাসা করা দরকার, তবে ব্যবহারকারীরা নেস্টেড ডেটা স্ট্রাকচারগুলিতে সরবরাহিত ডেটার সাথে, যা আমরা নিয়ন্ত্রণ করতে পারি না, তবে (ক) মঙ্গোতে সঞ্চয় করতে চাই , (খ) আমরা জানি যে কোন নির্দিষ্ট ক্ষেত্রগুলিতে এটি ঘটতে পারে (উদাহরণস্বরূপ modelsএখানে), এবং (গ) আমরা মঙ্গোর মূল নামে তাদের জিজ্ঞাসা করতে চাই না। সুতরাং আমি যে প্যাটার্নটিতে স্থির হয়েছি তা হল JSON.stringifyএই ক্ষেত্রটি সংরক্ষণের দিকে, এবং 'JSON.parse` পুনরুদ্ধারে।
প্রোটোটাইপ

16
যদি আপনার অবশ্যই হয় তবে আপনি এই সমস্যাটিকে বাইপাস করার জন্য {চেক_কিজ: ভুয়া} বিকল্প সরবরাহ করতে পারেন।
জাজি বার যোচাই

4
@ZuryBarYochay OMG- কে আপনি উত্তর-পশ্চিম প্যাসেজের সমান মঙ্গোডিবি পেয়েছেন found আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
প্রোটোটাইপ

4
@ এমেরেল ডিবি.কমলিকেশন_ফু.আপডেট ({এটি: "এটি"}, {$ সেট: {এ: "বি"}}, {চেক_কিজ: ভুয়া})
জাজি বার যোচে

22

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

কেবল প্রতিস্থাপন সমস্যা .সঙ্গে [dot]বা U+FF0E(এই পৃষ্ঠাটির অন্যত্রে উল্লিখিত) কি তখন ব্যবহারকারী বৈধভাবে কী জমা করতে চায় ঘটে, হয় [dot]বা U+FF0E?

ফ্যান্টমের আফমোরিয়া ড্রাইভারটি যে পদ্ধতি গ্রহণ করেছে তা হ'ল জাভা এর মতো ইউনিকোড এস্কেপ সিকোয়েন্স ব্যবহার করা, তবে পালানো চরিত্রটি আগে পালানো নিশ্চিত করা। সংক্ষেপে, নিম্নলিখিত স্ট্রিং প্রতিস্থাপনগুলি করা হয় (*):

\  -->  \\
$  -->  \u0024
.  -->  \u002e

পরবর্তীতে মঙ্গোডিবি থেকে মানচিত্র কীগুলি পড়লে বিপরীত প্রতিস্থাপন করা হয় ।

অথবা ফ্যান্টম কোডে:

Str encodeKey(Str key) {
    return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")
}

Str decodeKey(Str key) {
    return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")
}

এই জাতীয় কীগুলির জন্য অনুসন্ধানগুলি তৈরি করার সময় কেবলমাত্র একজন ব্যবহারকারীকে এই ধরণের রূপান্তর সম্পর্কে সচেতন হওয়া প্রয়োজন।

dotted.property.namesকনফিগারেশনের উদ্দেশ্যে ডেটাবেজে সংরক্ষণ করা সাধারণ বলে আমি বিশ্বাস করি যে এই ধরণের সমস্ত মানচিত্র কীগুলিকে কেবল নিষিদ্ধ করার চেয়ে এই পদ্ধতির পক্ষে ভাল।

(*) আফফোর্ফিয়া জাভাতে ইউনিকোড এস্কেপ সিনট্যাক্সে উল্লিখিত হিসাবে সম্পূর্ণ / যথাযথ ইউনিকোড পালানোর নিয়ম সম্পাদন করে তবে বর্ণিত প্রতিস্থাপন ক্রমটি ঠিক একইভাবে কাজ করে।


//gসমস্ত ঘটনাগুলি প্রতিস্থাপন করার জন্য ব্যবহার করা উচিত এবং কেবল প্রথমটি নয়। এছাড়াও, মার্টিন কোনেকনির উত্তর হিসাবে সম্পূর্ণ প্রস্থের সমতুল্য ব্যবহার করা ভাল ধারণা বলে মনে হচ্ছে। শেষ পর্যন্ত, এনকোডিংয়ের জন্য একটি ব্যাকস্ল্যাশ যথেষ্ট। key.replace(/\./g, '\uff0e').replace(/\$/g, '\uff04').replace(/\\/g, '\uff3c')
সিডব্লু '

4
@cw '- কোডটি জাভাতে সিনট্যাক্সের মতো রয়েছে, সুতরাং প্রতিস্থাপনটি আসলে সমস্ত উপস্থিতি প্রতিস্থাপন করে এবং ব্যাকস্ল্যাশ থেকে বেরিয়ে আসার জন্য ডাবল ব্যাকস্ল্যাশ প্রয়োজন। এবং আবারও, সমস্ত কেস কভার হয় তা নিশ্চিত করার জন্য আপনাকে পালানোর কিছু ফর্ম প্রবর্তন করতে হবে । কেউ, কিছু সময়ে, আসলে এর চাবি চাইতে পারে U+FF04
স্টিভ আইনন

4
দেখা যাচ্ছে, মোংডব তার সর্বশেষ সংস্করণে বিন্দু এবং ডলার সমর্থন করে। দেখুন: - stackoverflow.com/a/57106679/3515086
Abhidemon

18

মোঙ্গো ডক্স যেমন অবৈধ অক্ষর প্রতিস্থাপন করার পরামর্শ দিই $এবং .তাদের ইউনিকোড সমতুল সঙ্গে।

এই পরিস্থিতিতে, কীগুলিকে সংরক্ষিত subst এবং। চরিত্র. যে কোনও চরিত্রই যথেষ্ট, তবে ইউনিকোড পূর্ণ প্রস্থের সমতুল্য: ইউ + এফএফ04 (অর্থাত্ "$") এবং ইউ + এফএফ0ই (অর্থাত্ "।") ব্যবহার করুন।


74
এটি রাস্তায় ডাউন ডিবাগিং মাথাব্যথার একটি রেসিপি বলে মনে হচ্ছে।
কেউ

4
@ অ্যান্ড্রুমেডিকো, @ তমলিন - আমি মনে করি ডকসগুলি এর অর্থ কিছুdb.test.insert({"field\uff0ename": "test"})
পি। মায়ার নোর

4
-১ এ। এটি একটি ভয়ানক ধারণা what কেউ যদি সেই ইউনিকোড চরিত্রগুলিকে কী হিসাবে ব্যবহার করার চেষ্টা করে তবে কী হবে? তারপরে আপনার একটি নীরব ত্রুটি রয়েছে যা কে করবে আপনার সিস্টেমে কী তা জানে। অস্পষ্টতা অবলম্বন পদ্ধতিগুলি এর মতো ব্যবহার করবেন না। বি। মঙ্গো ডক্স আর তা বলে না, সম্ভবত কেউ এর ভয়াবহ ধারণা বুঝতে পেরেছেন
বিটি

7
@ সেরজিওটুলেন্টেভ আমি তাদের এই প্রস্তাবটি সরিয়ে নেওয়ার জন্য পেয়েছি:) github.com/mongodb/docs/commit/…
বিটি

4
@ বিটি: আপনার কাছে টুপি টিপুন, স্যার :)
সেরজিও টুলেন্টসেভ

15

মঙ্গোডিবি এর সর্বশেষতম স্থিতিশীল সংস্করণ (v3.6.1) এখন কী বা ফিল্ডের নামগুলিতে বিন্দু (।) সমর্থন করে।

ক্ষেত্রের নামগুলিতে এখন বিন্দু (।) এবং ডলার ($) অক্ষর থাকতে পারে


10
এমনকি সার্ভার যদি এখন এটি সমর্থন করে তবে ড্রাইভার এখনও still এবং কীগুলিতে ডটগুলি পরীক্ষা করে এবং সেগুলি গ্রহণ করে না। সুতরাং মঙ্গো কেবল তাত্ত্বিকভাবে বিন্দু এবং ডলার অক্ষরকে সমর্থন করে। ব্যবহারিকভাবে এটি এখনও ব্যবহারযোগ্য নয় :(
জ্যাম্যাক্স

হতে পারে আপনি কিছু পুরানো বা বেমানান ক্লায়েন্ট ব্যবহার করছেন। আমি এটি আমার প্রোডাকশন সার্ভারগুলিতে কোনও ঘাম ছাড়াই ব্যবহার করছি। আমি নোডজেএস এবং জাভা ক্লায়েন্টদের জন্য চেক করেছি।
h4ck3d 22'18

জাভা দিয়ে এটা অবশ্যই কাজ করে না! নিম্নলিখিত কমান্ডটি mongoClient.getDatabase("mydb").getCollection("test").insertOne(new Document("value", new Document("key.with.dots", "value").append("$dollar", "value")));ব্যবহার করে দেখুন : এটি মঙ্গডব-ড্রাইভার ৩..3.৩ এবং মঙ্গোডিবি ৩. using.৩ ব্যবহার করে ব্যর্থ হয়েছে।
জেম্যাক্স

4
আসলে, আমি কেবল একটি সেটআপ দিয়ে চেষ্টা করেছি mongodb-4.1.1এবং pymongo-3.7.1। আমি .রোবমঙ্গো দিয়ে কীগুলি সম্বলিত নথিগুলি যুক্ত করতে পারি তবে pymongoএটি থেকে নয় , এটি InvalidDocument: key '1.1' must not contain '.'ইচ্ছা করে তোলে যে এখনই এটি ঠিক করা হয়েছিল ...
শেখা একটি

আমি মংডোব সার্ভার 4.0.০.৯ এবং জাভা ড্রাইভার ৩.১০.২ দিয়ে চেষ্টা করেছি কিন্তু এটি মূল নামে ডট গ্রহণ করে না। এটি আশ্চর্যের বিষয় যে যখন রোবমঙ্গো ব্যবহার করে এটি কাজ করে ...
xyzt

12

একটি সমাধান আমি সবেমাত্র প্রয়োগ করেছি যে মূল নাম এবং মান দুটি পৃথক ক্ষেত্রে বিভক্ত করার সাথে আমি সত্যিই খুশি। এইভাবে, আমি চরিত্রগুলি হুবহু একই রাখতে পারি, এবং এই পার্সিং দুঃস্বপ্নগুলির কোনওর জন্যই উদ্বিগ্ন নই। দস্তাবেজের মতো দেখতে হবে:

{
    ...
    keyName: "domain.com",
    keyValue: "unregistered",
    ...
}

আপনি এখনও findক্ষেত্রগুলি কী- নেম এবং কীভ্যালুতে কাজ করে এটি যথেষ্ট সহজ জিজ্ঞাসা করতে পারেন ।

এর পরিবর্তে:

 db.collection.find({"domain.com":"unregistered"})

যা আসলে প্রত্যাশার মতো কাজ করে না, আপনি দৌড়াবেন:

db.collection.find({keyName:"domain.com", keyValue:"unregistered"})

এবং এটি প্রত্যাশিত দলিলটি ফিরিয়ে দেবে।


আপনি এটি কিভাবে? আপনি দয়া করে একই ক্ষেত্রে আমাকে সাহায্য করতে পারেন।
প্রোফাইলার

আমি একটি প্রশ্নের উদাহরণ যুক্ত করেছি। এটা কি সাহায্য করে?
স্টিভ

10

আপনি মানটির পরিবর্তে কীটিতে একটি হ্যাশ ব্যবহার করে দেখতে পারেন এবং তারপরে সেই মানটি JSON মানে সঞ্চয় করতে পারেন।

var crypto = require("crypto");   

function md5(value) {
    return crypto.createHash('md5').update( String(value) ).digest('hex');
}

var data = {
    "_id": {
        "$oid": "..."
    },
    "make": "saab",
    "models": {}
}

var version = "9.7x";

data.models[ md5(version) ] = {
    "version": version,
    "years" : [
        2007,
        2008,
        2009,
        2010
    ]
}

আপনি পরে হ্যাশ ব্যবহার করে মডেলগুলি অ্যাক্সেস করতে পারবেন।

var version = "9.7x";
collection.find( { _id : ...}, function(e, data ) {
    var models = data.models[ md5(version) ];
}

4
আমি এটি পছন্দ করি, 1-ওয়ে হ্যাশিং সহ পরিষ্কার সমাধান এবং জিনিসগুলি হুডের নীচে কাজ করার সাথে সত্যই মিল similar
মাইকেল ইয়াগুদায়েভ

4
কী হিসাবে হ্যাশগুলি ব্যবহার করার ক্ষেত্রে সমস্যাটি হ'ল এগুলি অনন্য হওয়ার গ্যারান্টিযুক্ত নয় এবং তারা প্রায়শই সংঘর্ষ তৈরি করে । প্লাস আপনি যখনই কোনও মানচিত্র অ্যাক্সেস করতে চান প্রতিবার কোনও ক্রিপ্টোগ্রাফিক হ্যাশ গণনা করা আমার কাছে সবচেয়ে অনুকূল সমাধান বলে মনে হয় না।
স্টিভ আইনন

4
কেন একটি বিশেষ চরিত্র বা অনুক্রমের সাথে পিরিয়ড প্রতিস্থাপনের চেয়ে ভাল?
বি সেভেন

স্ট্রিংগুলিকে বেস 64 এ রূপান্তর করা আরও ভাল।
জেন

8

এটি এখন সমর্থিত

মঙ্গোডিবি 3.6 এর পরে ক্ষেত্রের নামগুলিতে উভয় বিন্দু এবং ডলার সমর্থন করে । জিরার নীচে দেখুন: https://jira.mongodb.org/browse/JAVA-2810

আপনার মংডডবকে 3.6+ এ আপগ্রেড করা সবচেয়ে ভাল যাওয়ার মত শোনায়।


এটি এখানে সেরা উত্তর। : +1
হ্যালো_আবিষেক

4
3.6 তাদের সংরক্ষণ করতে পারেন হ্যাঁ, কিন্তু এটা করা হয় না এখনও সমর্থিত, ড্রাইভার ত্রুটি নিক্ষেপ পারে, এবং কোয়েরি / আপডেট বিরতি করতে পারেন: বিধিনিষেধ : "MongoDB ক্যোয়ারী ল্যাঙ্গুয়েজ সবসময় অর্থপূর্ণ নথি যার ক্ষেত্র নামে এই অক্ষরগুলি ধারণ উপর প্রশ্নের প্রকাশ করতে পারবেন না (SERVER- দেখতে 30575)। যতক্ষণ না সমর্থন কোয়েরি ভাষায়, $ ব্যবহার করুন এবং যোগ করা হয়। ক্ষেত্র নাম সুপারিশ করা হয় না এবং করা হয় সমর্থিত নয় কর্মকর্তা MongoDB ড্রাইভার দ্বারা। "
জেরেমিডগ্লাস

4

থেকে MongoDB ডক্স " '।' অক্ষরটি অবশ্যই মূল নামের কোথাও উপস্থিত হবে না। দেখে মনে হচ্ছে আপনাকে একটি এনকোডিং স্কিম নিয়ে আসতে হবে বা না করেই করতে হবে।


4

আপনার কীগুলি পালাতে হবে। যেহেতু মনে হয় বেশিরভাগ লোকেরা সঠিকভাবে স্ট্রিংগুলি থেকে বাঁচতে জানেন না, তাই এই পদক্ষেপগুলি এখানে:

  1. একটি পালানোর চরিত্রটি চয়ন করুন (একটি চরিত্র যা খুব কম ব্যবহৃত হয় তা বেছে নেওয়া ভাল)। যেমন '~'
  2. অব্যাহতি পেতে প্রথমে আপনার পালানোর চরিত্রের (যেমন '~' -> '~ t') চালিত অনুক্রমের সাথে সাথে পালানোর অক্ষরের সমস্ত উদাহরণকে প্রতিস্থাপন করুন, তারপরে আপনার পালানোর চরিত্রের সাথে চালিত কিছু অনুক্রমের সাথে আপনার যে চরিত্র বা অনুক্রমের দরকার হবে তা প্রতিস্থাপন করুন । যেমন ' -> '~ পি'
  3. আনস্কেপ করার জন্য, প্রথমে আপনার দ্বিতীয় পালানোর ক্রম (যেমন 'sequ p' -> '।') থেকে পালানোর ক্রমটি সরিয়ে ফেলুন, তারপরে আপনার পালানোর অক্ষরের অনুক্রমটি একক পালানোর অক্ষরে রূপান্তর করুন (যেমন '~ s' -> '~ ')

এছাড়াও, মনে রাখবেন যে মঙ্গো কীগুলি '$' দিয়ে শুরু করতে দেয় না, তাই আপনাকে সেখানে অনুরূপ কিছু করতে হবে

এখানে এমন কিছু কোড রয়েছে যা এটি করে:

// returns an escaped mongo key
exports.escape = function(key) {
  return key.replace(/~/g, '~s')
            .replace(/\./g, '~p')
            .replace(/^\$/g, '~d')
}

// returns an unescaped mongo key
exports.unescape = function(escapedKey) {
  return escapedKey.replace(/^~d/g, '$')
                   .replace(/~p/g, '.')
                   .replace(/~s/g, '~')
}

এই পলায়ন এখনও ভেঙে যেতে পারে, যদি আপনি '। ~ পি' এর মতো স্ট্রিং পেয়ে থাকেন। এখানে পালানো স্ট্রিংটি '~ p ~~ p ~ p' হবে। আনস্কেপিং আপনাকে '। ~ ..' দেবে, যা আসল স্ট্রিং থেকে আলাদা।
jvc

4
@jvc ঠিক বলেছেন! আমি ব্যাখ্যা এবং উদাহরণ এড়ানোর কার্যকারিতা স্থির করেছি। তারা এখনও ভাঙ্গা থাকলে আমাকে জানাবেন!
বিটি

3

দেরিতে উত্তর, তবে আপনি যদি বসন্ত এবং মঙ্গো ব্যবহার করেন তবে স্প্রিং আপনার সাথে রূপান্তর পরিচালনা করতে পারে MappingMongoConverter। এটি জনিএইচকে দ্বারা সমাধান তবে বসন্ত দ্বারা পরিচালিত।

@Autowired
private MappingMongoConverter converter;

@PostConstruct
public void configureMongo() {
 converter.setMapKeyDotReplacement("xxx");
}

আপনার সঞ্চিত জসন যদি হয়:

{ "axxxb" : "value" }

স্প্রিংয়ের মাধ্যমে (মঙ্গোস্লায়েন্ট) এটি পড়বে:

{ "a.b" : "value" }

'org.springframework.data.mongodb.core.convert.MappingMongoConverter' টাইপের একটি মটরশুটি দরকার যা পাওয়া যায়নি।
সত্য নারায়ণ সি

1

আমি প্রতিটি অবজেক্ট কী এর জন্য জাভাস্ক্রিপ্টে নিম্নলিখিত অবকাশ ব্যবহার করি:

key.replace(/\\/g, '\\\\').replace(/^\$/, '\\$').replace(/\./g, '\\_')

আমি এটি সম্পর্কে যা পছন্দ করি তা হ'ল এটি কেবলমাত্র $শুরুতে প্রতিস্থাপন করে এবং এটি ইউনিকোড অক্ষর ব্যবহার করে না যা কনসোলটিতে ব্যবহার করা জটিল। _আমার কাছে একটি ইউনিকোড চরিত্রের চেয়ে অনেক বেশি পঠনযোগ্য। এটি বিশেষ অক্ষরের একটি সেট ( $, .) অন্য (ইউনিকোড) এর সাথে প্রতিস্থাপন করে না । তবে সঠিকভাবে traditionalতিহ্যবাহী হয়ে পালিয়ে যায় \


4
এবং যদি কেউ তাদের যে কোনও একটিতে _ ব্যবহার করে, আপনি বাগ পাবেন।
বিটি

1

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

/** This will replace \ with ⍀, ^$ with '₴' and dots with ⋅  to make the object compatible for mongoDB insert. 
Caveats:
    1. If you have any of ⍀, ₴ or ⋅ in your original documents, they will be converted to \$.upon decoding. 
    2. Recursive structures are always an issue. A cheap way to prevent a stack overflow is by limiting the number of levels. The default max level is 10.
 */
encodeMongoObj = function(o, level = 10) {
    var build = {}, key, newKey, value
    //if (typeof level === "undefined") level = 20     // default level if not provided
    for (key in o) {
        value = o[key]
        if (typeof value === "object") value = (level > 0) ? encodeMongoObj(value, level - 1) : null     // If this is an object, recurse if we can

        newKey = key.replace(/\\/g, '⍀').replace(/^\$/, '₴').replace(/\./g, '⋅')    // replace special chars prohibited in mongo keys
        build[newKey] = value
    }
    return build
}

/** This will decode an object encoded with the above function. We assume the structure is not recursive since it should come from Mongodb */
decodeMongoObj = function(o) {
    var build = {}, key, newKey, value
    for (key in o) {
        value = o[key]
        if (typeof value === "object") value = decodeMongoObj(value)     // If this is an object, recurse
        newKey = key.replace(/⍀/g, '\\').replace(/^₴/, '$').replace(/⋅/g, '.')    // replace special chars prohibited in mongo keys
        build[newKey] = value
    }
    return build
}

এখানে একটি পরীক্ষা:

var nastyObj = {
    "sub.obj" : {"$dollar\\backslash": "$\\.end$"}
}
nastyObj["$you.must.be.kidding"] = nastyObj     // make it recursive

var encoded = encodeMongoObj(nastyObj, 1)
console.log(encoded)
console.log( decodeMongoObj( encoded) )

এবং ফলাফল - নোট করুন যে মানগুলি সংশোধিত হয়নি:

{
  sub⋅obj: {
    ₴dollar⍀backslash: "$\\.end$"
  },
  ₴you⋅must⋅be⋅kidding: {
    sub⋅obj: null,
    ₴you⋅must⋅be⋅kidding: null
  }
}
[12:02:47.691] {
  "sub.obj": {
    $dollar\\backslash: "$\\.end$"
  },
  "$you.must.be.kidding": {
    "sub.obj": {},
    "$you.must.be.kidding": {}
  }
}

1

এটি জিজ্ঞাসা করার কিছু কুৎসিত উপায় রয়েছে এটি ডিবাগ উদ্দেশ্যে (কেবলমাত্র এম্বেড করা বস্তুগুলিতে কাজ করে) এর পরিবর্তে প্রয়োগে এটি ব্যবহারের প্রস্তাব দেওয়া হয় না :

db.getCollection('mycollection').aggregate([
    {$match: {mymapfield: {$type: "object" }}}, //filter objects with right field type
    {$project: {mymapfield: { $objectToArray: "$mymapfield" }}}, //"unwind" map to array of {k: key, v: value} objects
    {$match: {mymapfield: {k: "my.key.with.dot", v: "myvalue"}}} //query
])

1

অন্য একজন ব্যবহারকারী যেমন উল্লেখ করেছেন, এটি এনকোডিং / ডিকোডিং ভবিষ্যতে সমস্যা হতে পারে, তাই বিন্দুযুক্ত সমস্ত কীগুলি প্রতিস্থাপন করা খুব সহজ। এখানে 'এর সাথে কীগুলি প্রতিস্থাপন করতে আমি করেছি একটি পুনরাবৃত্ত ফাংশন। ঘটনা:

def mongo_jsonify(dictionary):
    new_dict = {}
    if type(dictionary) is dict:
        for k, v in dictionary.items():
            new_k = k.replace('.', '-')
            if type(v) is dict:
                new_dict[new_k] = mongo_jsonify(v)
            elif type(v) is list:
                new_dict[new_k] = [mongo_jsonify(i) for i in v]
            else:
                new_dict[new_k] = dictionary[k]
        return new_dict
    else:
        return dictionary

if __name__ == '__main__':
    with open('path_to_json', "r") as input_file:
        d = json.load(input_file)
    d = mongo_jsonify(d)
    pprint(d)

আপনি এই কোডটি '$' প্রতিস্থাপন করতেও সংশোধন করতে পারেন, কারণ এটি অন্য একটি চরিত্র যা মঙ্গো কোনও কীতে অনুমতি দেয় না।


0

পিএইচপি-র জন্য আমি পিরিয়ডের জন্য এইচটিএমএল মানটি প্রতিস্থাপন করি। এটাই "."

এটি মঙ্গোডিবিতে এটি স্টোর করে:

  "validations" : {
     "4e25adbb1b0a55400e030000" : {
     "associate" : "true" 
    },
     "4e25adb11b0a55400e010000" : {
       "associate" : "true" 
     } 
   } 

এবং পিএইচপি কোড ...

  $entry = array('associate' => $associate);         
  $data = array( '$set' => array( 'validations.' . str_replace(".", `"."`, $validation) => $entry ));     
  $newstatus = $collection->update($key, $data, $options);      


0

আপনি এটি হিসাবে এটি সংরক্ষণ করতে পারেন এবং সুন্দর পরে রূপান্তর করতে পারেন

আমি লাইভস্ক্রিপ্টে এই উদাহরণটি লিখেছি। লাইফস্ক্রিপ.টোন ওয়েবসাইটটি এটি ব্যবহার করতে ব্যবহার করতে পারেন

test =
  field:
    field1: 1
    field2: 2
    field3: 5
    nested:
      more: 1
      moresdafasdf: 23423
  field3: 3



get-plain = (json, parent)->
  | typeof! json is \Object => json |> obj-to-pairs |> map -> get-plain it.1, [parent,it.0].filter(-> it?).join(\.)
  | _ => key: parent, value: json

test |> get-plain |> flatten |> map (-> [it.key, it.value]) |> pairs-to-obj

এটি উত্পাদন করবে

{"field.field1":1,
 "field.field2":2,
 "field.field3":5,
 "field.nested.more":1,
 "field.nested.moresdafasdf":23423,
 "field3":3}


0

আপনাকে আমার টিপটি দিন: আপনি JSON.stringify ব্যবহার করে অবজেক্ট / অ্যারে সংরক্ষণ করতে পারবেন কী নামটিতে বিন্দু রয়েছে, তারপরে JSON এর সাথে অবজেক্টে স্ট্রিংকে পার্স করুন যখন ডাটাবেস থেকে ডেটা পাবেন তখন প্রক্রিয়া করতে

আর একটি কার্যনির্বাহী: আপনার স্কিমার পুনর্গঠন করুন:

key : {
"keyName": "a.b"
"value": [Array]
}

0

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


0

ডট ( .) বা ডলার ( $) এর সাথে অন্য অক্ষরগুলি প্রতিস্থাপন করুন যা কখনই আসল নথিতে ব্যবহার হয় না। এবং দস্তাবেজটি পুনরুদ্ধার করার সময় ডট ( .) বা ডলার ( $) পুনরুদ্ধার করুন। কৌশলটি ব্যবহারকারী যে ডেটা পড়বে তাতে প্রভাব ফেলবে না।

আপনি সমস্ত অক্ষর থেকে চরিত্রটি নির্বাচন করতে পারেন ।


0

আশ্চর্যের বিষয়টি হ'ল, মঙ্গোজগুলি ব্যবহার করে, আমি যদি _ID নিজেই সেট করি তবে আমি বিন্দু দিয়ে একটি ডকুমেন্ট তৈরি করতে পারি, তবে _id তৈরি হওয়ার সময় আমি কোনও নথি তৈরি করতে পারি না:

কাজ করে:

db.testcollection.save({"_id": "testdocument", "dot.ted.": "value"}, (err, res) => {
    console.log(err, res);
});

কাজ করে না:

db.testcollection.save({"dot.ted": "value"}, (err, res) => {
    console.log(err, res);
});

আমি প্রথমে ভেবেছিলাম ডট কী ডট কী দিয়ে ডকুমেন্ট আপডেট করাও কাজ করেছিল তবে এটি বিন্দুকে সাবকি হিসাবে সনাক্ত করছে!

মঙ্গোজগুলি কীভাবে বিন্দু (সাবকি) পরিচালনা করে তা দেখে, আমি নিশ্চিত করতে যাচ্ছি যে আমার কীগুলিতে কোনও বিন্দু নেই।


0

@ জননিএইচকে যেমন উল্লেখ করেছেন, তার মতো , যতিচিহ্নগুলি সরান বা ''। আপনার কীগুলি থেকে কারণ এটি যখন আপনার ডেটা আরও বড় ডেটাসেটে জমা হতে শুরু করে তখন অনেক বড় সমস্যা তৈরি করে। এটি বিশেষত যখন আপনি সামগ্রিক অপারেটরগুলিকে কল করে which একীভূত করার জন্য যখন অ্যাক্সেস এবং কীগুলির তুলনা প্রয়োজন যা কোনও ত্রুটি ছুঁড়ে ফেলেছে তার জন্য সমস্যার সৃষ্টি করবে। আমি এটি শক্তভাবে শিখেছি দয়া করে যারা শুরু করছেন তাদের জন্য পুনরাবৃত্তি করবেন না।


-2

/home/user/anaconda3/lib/python3.6/site-packages/pymongo/collection.py

এটি ত্রুটির বার্তায় পাওয়া গেছে। যদি আপনি ব্যবহার anacondaকরে (যদি না সংবাদদাতা ফাইল খুঁজে), কেবল থেকে মান পরিবর্তন check_keys = Trueকরতে Falseউপরে বর্ণিত ফাইলে। কাজ করবে!

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