মঙ্গুজ অনন্য সূচক কাজ করছে না!


95

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

User = new Schema ({
  email: {type: String, index: {unique: true, dropDups: true}}
})

আমি একই ইমেল সহ 2 জন ব্যবহারকারীকে বাঁচাতে পারি। ডার্ন

একই সমস্যাটি এখানে প্রকাশ করা হয়েছে: https://github.com/LearnBoost/mongoose/issues/56 , তবে সেই থ্রেডটি পুরানো এবং কোথাও পৌঁছে যায়।

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

কারও কি এর সমাধান আছে?


4
খারাপ খবর, এটি এখনও মঙ্গোদ ভি 2.4.3.3, মঙ্গুজ ভি 3.6.20
দম্পাটে

অনন্য আমার হোস্টগুলির মধ্যে একটিতে কাজ করছে বলে মনে হচ্ছে তবে ভিন্ন হোস্টে ঠিক একই নোড / মঙ্গুজ কোড ব্যবহার করে অদ্ভুত প্রয়োগ করতে ব্যর্থ। হোস্টটি সঠিকভাবে কাজ করে যা সিঙ্গল মংডোড ৩.৪.১০ চালায়, যা না - মঙ্গড ৩.২.১ rep দিয়ে রেপ্লিকা সেট চালায় both উভয় হোস্টে আমি স্ক্র্যাচ থেকে সংগ্রহ তৈরি করছি, সুতরাং বিদ্যমান ডুপগুলি কোনও সমস্যা নয়। আমি এই পৃষ্ঠায় বেশিরভাগ সমাধানের চেষ্টা করেছি এবং যেটি কাজ করেছিল তা হলেন @ ইসাক পাকের মঙ্গুজ-অনন্য-বৈধকরণকারী।
ম্যাকসেম

উত্তর:


95

উফফফফ! আপনাকে কেবল মঙ্গো পুনরায় চালু করতে হবে।


4
আমার একই সমস্যা রয়েছে তবে আমি কীভাবে ওএসএক্সে মঙ্গো পুনরায় চালু করতে পারি তা খুঁজে পাচ্ছি না। আমি যখন প্রক্রিয়াটি মেরে ফেলব, তখন এটি আবার স্বয়ংক্রিয়ভাবে স্প্যান হয়ে যাবে এবং অনন্য সূচকটি এখনও কাজ করছে না ... কোনও ধারণা?
রাগুলকা

7
"ওফস আপনাকে কেবল মঙ্গো পুনরায় চালু করতে হবে" মানে কি ?! আপনি কি বলছেন যে ডাটাবেসটি নামিয়ে না নিয়ে কোনও সূচক যুক্ত করা অসম্ভব?
অ্যান্ড্রুর্ক

7
এটা সত্য নয়। একটি সূচক যুক্ত করতে আপনাকে মঙ্গো পুনরায় চালু করার দরকার নেই।
জনিএইচকে

4
অনন্য জিনিসের জন্য .. আমি মঙ্গো পুনরায় চালু করতে চাই .. এবং এটি কাজ করেছে .. ধন্যবাদ!
মুহাম্মদ আহসান আয়াজ

4
আমি আবার চালু করার চেষ্টা করেছি। পুনর্নির্মাণও। এটি সমাধানের জন্য ডাটাবেসটি ফেলে দিতে হয়েছিল। ইস্যুটি অনুমান করা যায় যে সূচকগুলি যুক্ত করার আগে নকলগুলি ইতিমধ্যে বিদ্যমান ছিল তাই কোনও প্রোডাক্ট ডিবিতে আমাকে নকলগুলি সরিয়ে পুনরায় আরম্ভ করতে হবে?
isimmons

40

উফফফফ! আপনাকে কেবল মঙ্গো পুনরায় চালু করতে হবে।

এবং পুনরায় সূচিও সহ:

mongo <db-name>
> db.<collection-name>.reIndex()

পরীক্ষায়, যেহেতু আমার কাছে গুরুত্বপূর্ণ ডেটা নেই, আপনি এগুলি করতে পারেন:

mongo <db-name>
> db.dropDatabase()

16
db.DPDatabase () আপনার ডাটাবেস মুছে দেয়!
আইজাক পাক

28

আমি একই ইস্যুতে দৌড়েছি: ইতিমধ্যে ডিবিতে ব্যবহারকারীদের যুক্ত করার পরে আমি এই emailক্ষেত্রটির জন্য অনন্য প্রতিবন্ধকতা UserSchemaযুক্ত করেছি এবং এখনও ডুপ ইমেলের সাহায্যে ব্যবহারকারীদের বাঁচাতে সক্ষম হয়েছি। আমি নিম্নলিখিতটি দ্বারা এটি সমাধান করেছি:

1) ব্যবহারকারীদের সংগ্রহ থেকে সমস্ত নথি সরান।

2) মঙ্গো শেল থেকে কমান্ডটি কার্যকর করুন: db.users.createIndex({email: 1}, {unique: true})

পদক্ষেপ 1 সম্পর্কে, মঙ্গোর ডক্স থেকে নোট করুন:

মঙ্গোডিবি নির্দিষ্ট সূচী ক্ষেত্রগুলিতে কোনও অনন্য সূচক তৈরি করতে পারে না যদি সংগ্রহে ইতিমধ্যে এমন ডেটা থাকে যা সূচকটির জন্য অনন্য বাধা লঙ্ঘন করে।

https://docs.mongodb.com/manual/core/index-unique/


11

আপনি মোঙ্গোতে কিছু নকল রেখে দিলে এই আচরণটিও ঘটে। আপনার অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে মঙ্গুজ এগুলিকে তৈরি করার চেষ্টা করবে।

এটি প্রতিরোধ করতে, আপনি এই ত্রুটিটি এভাবে পরিচালনা করতে পারেন:

yourModel.on('index', function(err) {
  if (err?) {
    console.error err
  }
);

10

ঠিক আছে, আমি মাঠে সূচক যুক্ত করে এবং অনন্য সম্পত্তি সেট করে মঙ্গোশেল থেকে এটি সমাধান করতে সক্ষম হয়েছি:

db.<collectionName>.ensureIndex({fieldName: 1}, {unique: true});

শেলের এইভাবে প্রতিক্রিয়া জানানো উচিত:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

এখন মঙ্গোশেল থেকে দ্রুত পরীক্ষা করতে:

var doc = {fieldName: 'abc'};
db.<collectionName>.insert(doc)

দেওয়া উচিত: রাইটারআরসাল্ট (I "n অন্তর্ভুক্ত": 1})

তবে আবার পুনরাবৃত্তি করার সময়:

db.<collectionName>.insert(doc)

দিতে হবে:

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: fuelConsumption.users.$email_1  dup key: { : \"martyna@martycud.com\" }"
    }
})

10

আমি এরকম কিছু করেছি:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const FooSchema = new Schema({
   name: { type: String, required: true, index: true, unique: true }
});

const Foo = mongoose.model('Foo', FooSchema);

Foo.createIndexes();

module.exports = Foo

আমি যোগ Foo.createIndexes()লাইন বিসি আমি নিম্নলিখিত থামিয়ে দেওয়া সাবধানবাণী পেয়ে ছিল যখন কোড দৌড়ে হচ্ছে ছিল:

(node:21553) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.

আমি Foo.createIndexes()অবিচ্ছিন্ন কিনা তা নিশ্চিত নই , তবে আফাইক জিনিসগুলি ঠিকঠাকভাবে কাজ করছে বলে মনে হচ্ছে


চারপাশে ঘোরাফেরা না করেই সমস্যার সমাধান করে এমন প্রশ্নের একমাত্র উত্তর।
দক্ষম গুপ্ত

এই উত্তরটি আমাকে সাহায্য করেছিল। আমার অনুপস্থিত index: trueসূচকটি তৈরি করার জন্য যা ছিল তা আমি হারিয়েছিলাম ।
এলসিড

6

ডকুমেন্টেশন অনুসারে: https://docs.mongodb.com/v2.6/tutorial/modify-an-index/

বিদ্যমান সূচিটি সংশোধন করতে আপনাকে সূচিটি ছেড়ে দিতে এবং পুনরায় তৈরি করতে হবে।

মঙ্গো পুনরায় শুরু করবেন না!

1 - সংগ্রহটি ফেলে দিন

db.users.drop()

2 - টেবিলটি পুনর্নির্মাণ করুন

db.users.ensureIndex({email: 1, type: 1}, {unique: true})

এটি বলছে যে ড্রপ সূচকটি সংগ্রহ নয়
জিরো0o

5

অ্যাপ্লিকেশন স্তর থেকে অনন্য সূচকগুলি প্রয়োগ করার সময় মঙ্গুজ কিছুটা আলগা হয়; সুতরাং, এটি হয় মঙ্গো ক্লাইম ব্যবহার করে নিজেই ডাটাবেস থেকে আপনার অনন্য সূচকগুলি প্রয়োগ করতে পছন্দ করে বা স্পষ্টভাবে মঙ্গুজকে বলে দেয় যে আপনি uniqueআপনার ইউজারচেমার ঠিক পরে নিম্নলিখিত কোডের লাইনটি লিখে সূচকটি সম্পর্কে গুরুতর :

UserSchema.index({ username: 1, email: 1 }, { unique: true});

এটি আপনার ব্যবহারকারীরচেমা উভয় ক্ষেত্রে usernameএবং emailক্ষেত্রগুলিতে অনন্য সূচী প্রয়োগ করবে । চিয়ার্স


4
পার্টিতে কিছুটা দেরি হয়ে গেছে, তবে "অনন্য সূচকগুলি প্রয়োগ করার সময় কিছুটা আলগা হয়ে যায়" এমন একটি
ওআরএম ভাল

কোনভাবেই সহায়তা করে না এমন মন্তব্যগুলি বেল্টল্টিংয়ের পক্ষে কী ভাল। এই সমাধানটি শক্ত এবং উত্পাদন প্রস্তুত।
আইজাক পাক

4

মঙ্গুজ চুপচাপ কোনও অনন্য সূচক যুক্ত করতে ব্যর্থ হবে যখন হয়:

  1. সংগ্রহটিতে ইতিমধ্যে একই নামের একটি সূচক রয়েছে
  2. সংগ্রহটিতে ইতিমধ্যে সূচিকৃত ক্ষেত্রের সদৃশগুলি সহ নথি রয়েছে

প্রথম ক্ষেত্রে, সূচকগুলি তালিকাভুক্ত করুন db.collection.getIndexes()এবং এর সাথে পুরাতন সূচিটি বাদ দিন db.collection.dropIndex("index_name")। আপনি যখন মঙ্গুজ অ্যাপ্লিকেশনটি পুনরায় চালু করবেন তখন এটি সঠিকভাবে নতুন সূচক যুক্ত করা উচিত।

দ্বিতীয় ক্ষেত্রে মঙ্গুজ অ্যাপ্লিকেশনটি পুনরায় চালু করার আগে আপনাকে নকলগুলি সরিয়ে ফেলতে হবে।


3

মঙ্গুজ-অনন্য-বৈধকরণকারী

এই প্লাগইনটি কীভাবে ব্যবহার করবেন:

1) এনপিএম ইনস্টল - সেভ মঙ্গুজ-অনন্য-বৈধকারী

2) আপনার স্কিমাতে এই গাইডটি অনুসরণ করুন:

// declare this at the top
var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');

// exampleSchema = mongoose.Schema({}) etc...

exampleSchema.plugin(uniqueValidator);

// module.exports = mongoose.model(...) etc....

3) মঙ্গুজ পদ্ধতি

এই জাতীয় পদ্ধতি ব্যবহার করার সময় findOneAndUpdateআপনাকে এই কনফিগারেশন অবজেক্টটি পাস করতে হবে:

{ runValidators: true, context: 'query' }

ie. User.findOneAndUpdate(
      { email: 'old-email@example.com' },
      { email: 'new-email@example.com' },
      { runValidators: true, context: 'query' },
      function(err) {
        // ...
    }

4) অতিরিক্ত বিকল্প

  1. সংবেদনশীল

    আপনার স্কিমাতে অনন্য ক্যাসি সংবেদনশীল বিকল্পটি ব্যবহার করুন

    ie. email: { type: String, index: true, unique: true, required: true, uniqueCaseInsensitive: true }

  2. কাস্টম ত্রুটি বার্তা

    ie. exampleSchema.plugin(uniqueValidator, { message: 'Error, expected {PATH} to be unique.' });

এখন আপনি মঙ্গো পুনরায় চালু করা, ডাটাবেসগুলি বাদ দেওয়া বা সূচী তৈরির চিন্তা না করে আপনার স্কিমায় অনন্য সম্পত্তি যুক্ত / মুছতে পারেন।

গুহাত (ডক্স থেকে):

যেহেতু আমরা ডাটাবেসে কোনও নথি উপস্থিত রয়েছে কিনা তা যাচাই করতে অ্যাসিঙ্ক অপারেশনের উপর নির্ভর করি, একই সাথে দুটি প্রশ্নের দুটি একই সাথে কার্যকর করা সম্ভব, উভয়ই 0 ফিরে আসে এবং তারপরে উভয়ই মঙ্গোডিবিতে প্রবেশ করানো সম্ভব।

সংগ্রহটি স্বয়ংক্রিয়ভাবে লক করা বা একক সংযোগ জোর করে বাইরে, এর আসল সমাধান নেই।

আমাদের বেশিরভাগ ব্যবহারকারীর ক্ষেত্রে এটি কোনও সমস্যা হবে না তবে এটি সচেতন হওয়ার একটি প্রান্তের বিষয়।


2

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


1

আপনি সূচকটি ফেলে দিয়েও এই সমস্যাটি সমাধান করতে পারেন;

ধরে নেওয়া যাক আপনি সংগ্রহ usersএবং ক্ষেত্র থেকে অনন্য সূচকটি মুছতে চান username, এটি টাইপ করুন:

db.users.dropIndex('username_1');


1

যদি সারণী / সংগ্রহটি খালি থাকে তবে ক্ষেত্রটির জন্য অনন্য সূচক তৈরি করুন:

db.<collection_name>.createIndex({'field':1}, {unique: true})

যদি সারণী / সংগ্রহটি খালি না থাকে তবে সংগ্রহটি ফেলে দিন এবং সূচি তৈরি করুন:

db.<collection_name>.drop()
db.<collection_name>.createIndex({'field':1}, {unique: true})

এখন মঙ্গোডিবি পুনরায় চালু করুন।


1

স্কিমায় অটোআইডেক্স সত্য কিনা তা পরীক্ষা করে দেখুন, আপনি মঙ্গুজ.কোনেক্ট বিকল্পগুলি ব্যবহার করার সময় এটি মিথ্যা (ডিফল্ট সত্য) সেট হতে পারে


1

আমি কিছুক্ষণ একই সমস্যার মুখোমুখি হয়েছি এবং প্রচুর অনুসন্ধান করেছি এবং আমার জন্য সমাধানটি ছিল createIndexes()ফাংশন।

আমি আশা করি যে সাহায্য করে।

সুতরাং কোড এর মত হবে।

User = new Schema ({
   email: {type: String, unique: true}
});
User.createIndexes();

0

আপনি যদি autoIndex: falseসংযোগ পদ্ধতিতে বিকল্পটি ব্যবহার করেন তবে :

mongoose.connect(CONNECTION_STRING, { autoIndex: false });

এটি অপসারণ করার চেষ্টা করুন। যদি এটি কাজ না করে তবে এই থ্রেডে যেমন পরামর্শ দেওয়া হয়েছে মঙ্গোদব পুনরায় চালু করার চেষ্টা করুন ।


0

আপনি আপনার স্কিমা হিসাবে হিসাবে সংজ্ঞায়িত করতে পারেন

User = new Schema ({
  email: {
      type: String,
      unique: true
  }
})

ইতিমধ্যে কোনও নথি থাকলেও এটি কাজ করবে না এবং এর পরে, আপনি ব্যবহারকারীর স্কিমা পরিবর্তন করেছেন। আপনি যদি সংগ্রহটি বাদ দিতে না চান তবে আপনি এই ব্যবহারকারীর সংগ্রহের জন্য ইমেলটিতে একটি সূচক তৈরি করতে পারেন। এই কমান্ডটি ব্যবহার করে আপনি ইমেইলে একটি সূচক তৈরি করতে পারেন।

db.User.createIndex({email:1},{unique: true})

অথবা আপনি কেবল সংগ্রহটি ফেলে দিতে এবং ব্যবহারকারীকে আবার যুক্ত করতে পারেন।
সংগ্রহটি ফেলে দেওয়ার জন্য, আপনি এটি প্রবেশ করতে পারেন:

db.User.drop()

0

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

  1. রবো 3 টিতে, সংগ্রহগুলি খোলার জন্য ডেটাবেসে ক্লিক করুন
  2. প্রশ্নটি সংগ্রহ প্রকাশের জন্য সংগ্রহগুলি খুলুন। আপনার সংগ্রহগুলি খালি কিনা তা নিশ্চিত করুন with
  3. সূচী ফোল্ডারে ডান ক্লিক করুন। ডিফল্টরূপে, আপনি দেখতে পাবেন_id_ হিসাবে । এখন, সূচক যুক্ত করুন নির্বাচন করুন
  4. একটি নাম চয়ন করুন, বলুন email , উদাহরণস্বরূপ ইমেল ক্ষেত্রের জন্য বলুন
  5. জেএসএন হিসাবে কী সরবরাহ করুন। উদাহরণ স্বরূপ

    {
       "email": 1
    }
    
  6. অনন্য চেকবক্সে ক্লিক করুন

  7. সংরক্ষণ

এটি মঙ্গোডিবিতে কোনও সদৃশ ইমেল সংরক্ষণ না করা নিশ্চিত করবে।


the "ইমেল" অবজেক্টে এখানে 1 এর অর্থ কী: 1}?
সিলুভেরু কিরণ কুমার

0

নিশ্চিত হয়ে নিন যে আপনার সংগ্রহে কোনও ক্ষেত্রের অপ্রয়োজনীয় কিছু নেই আপনি কেবল অনন্য সূচিটি চালু করেছেন।

তারপরে আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করুন (মঙ্গুজ)। এটি নিঃশব্দে সূচি ব্যর্থ করে।


0

সংগ্রহ থেকে সমস্ত নথি সরানো হচ্ছে:

db.users.remove({})

এবং পুনরায় সূচনা, যেমন অন্যেরা উল্লেখ করেছেন, আমার পক্ষে কাজ করেছেন


0

যদি আপনার মঙ্গোডিবি কোনও পরিষেবা হিসাবে কাজ করছে (এটি সন্ধানের সহজ উপায়টি যদি আপনার যদি টার্মিনালের মাধ্যমে মোংড.এক্সি ফাইলটি শুরু না করে ডাটাবেসের সাথে সংযোগ স্থাপনের প্রয়োজন না হয়), তবে পরিবর্তনগুলি করার পরে আপনাকে পরিষেবাটি পুনরায় আরম্ভ করতে হবে এবং / বা আপনার ডাটাবেস পুরোপুরি ফেলে দিন।

এটি বেশ আশ্চর্যজনক কারণ কিছু ব্যবহারকারীদের জন্য কেবলমাত্র একটি একক সংগ্রহ বাদ দিয়ে কাজ করা হয়েছিল। তাদের মধ্যে কিছুকে কেবল ডাটাবেস ফেলে দেওয়া দরকার। তবে তারা আমার পক্ষে কাজ করেনি। আমি ডাটাবেসটি ফেলে দিয়েছি, তারপরে মংগোডিবি সার্ভার পরিষেবাটি আবার চালু করেছি।

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

যদি অন্য পদ্ধতিগুলি আপনার পক্ষে কাজ না করে তবে আমি বিশ্বাস করি এটি কাজটি করবে।


0

আমার ক্ষেত্রে মঙ্গুজ পুরানো ছিল। আমি এটি সিএমডিতে পুরানো এনপিএম চালিয়ে পরীক্ষা করেছি। এবং আপডেট করেছেন 'মঙ্গুজ'।

এটি আপনার পক্ষে কাজ করে কিনা তা দয়া করে জানান।


আপনি কোন সংস্করণ ব্যবহার করছেন?
বাবু_

0

আপনি যখন অ্যাপ্লিকেশনটির সাথে আপনার ডাটাবেসটি সংযুক্ত করেন তখন এই বিকল্পটি যুক্ত করুন: "অডিওআইডেক্স: সত্য" উদাহরণস্বরূপ আমার কোডে আমি এটি করেছি:

const options = {
// your options go here
...
// this code is the solution
audoIndex: true
}
mongoose.connect(DB_URI, options);

আমার যে সমস্যাটিতে সমস্যা রয়েছে সে সংগ্রহটি আমিও বাদ দিয়েছি এবং এটি কাজ করবে কিনা তা নিশ্চিত করার জন্য এটি পুনরায় তৈরি করেছি। আমি এই সমাধানটি এখানে পেয়েছি: https://dev.to/emmysteven/solve-mongoose-unique-index-not-working-45d5 আমি "মোংগোডিবি পুনরায় চালু করার মতো সমাধানগুলি চেষ্টা করেছিলাম কিন্তু আমার পক্ষে কার্যকর হয়নি।"

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