মঙ্গোডিবি / মঙ্গুজ: শূন্য না হলে অনন্য


103

আমি ভাবছিলাম যে কোনও অনন্য সংগ্রহের এন্ট্রিকে জোর করার উপায় আছে কিনা তবে কেবল এন্ট্রিটি শূন্য না হলে । ই নমুনা স্কিমা:

var UsersSchema = new Schema({
    name  : {type: String, trim: true, index: true, required: true},
    email : {type: String, trim: true, index: true, unique: true}
});

এই ক্ষেত্রে 'ইমেল' প্রয়োজন হয় না তবে 'ইমেল' সংরক্ষণ করা থাকলে আমি নিশ্চিত করতে চাই যে এই এন্ট্রিটি অনন্য (একটি ডাটাবেস স্তরে)।

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

এখনই আমি এটি একটি অ্যাপ্লিকেশন স্তরে সমাধান করছি, তবে সেই ডিবি কোয়েরিটি সংরক্ষণ করতে ভাল লাগবে।

ধন্যবাদ

উত্তর:


168

মঙ্গোডিবি v1.8 + হিসাবে আপনি অনন্য মানগুলি নিশ্চিত করার ক্ষেত্রে sparseতবে সূচকটি সংজ্ঞায়িত করার সময় ক্ষেত্রটি ছাড়াই একাধিক ডক্সকে অনুমতি প্রদানের পছন্দসই আচরণ পেতে পারেন । হিসাবে:

email : {type: String, trim: true, index: true, unique: true, sparse: true}

বা শেলের মধ্যে:

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

লক্ষ্য করুন একটি অনন্য, বিক্ষিপ্ত সূচক এখনও একটি সঙ্গে একাধিক ডক্স অনুমতি দেয় না emailএকটি মাঠে মান এর nullএকমাত্র একাধিক ডক্স ছাড়া একটি emailক্ষেত্র।

দেখুন http://docs.mongodb.org/manual/core/index-sparse/


18
অসাধারণ! আমার মত নববর্ষের জন্য অবশ্যই অবশ্যই সেরা উত্তর ১.৮ এর পরে! দ্রষ্টব্য: মঙ্গুজ আপনার অনন্য সূচককে বিচিচিহ্ন হিসাবে আপডেট করবে না যদি আপনি কেবল একটি স্প্র্যাস যোগ করেন: আপনার স্কিমায় সত্য। আপনাকে সূচিটি ছেড়ে দিতে হবে এবং পুনরায় যুক্ত করতে হবে। ডান্নো যদি এটি প্রত্যাশিত বা কোনও বাগ।
অ্যাডাম এ

8
"দ্রষ্টব্য: সূচকটি ডিবিতে ইতিমধ্যে উপস্থিত থাকলে, এটি প্রতিস্থাপন করা হবে না।" - mongoosejs.com/docs/2.7.x/docs/schematypes.html
damphat

আমি মনে করি না যে এই প্রশ্নের সঠিক উত্তর দিয়েছে, কারণ নির্দিষ্ট ক্ষেত্র ব্যতীত কয়েকটি দস্তাবেজ সেই ক্ষেত্রের নাল মান সহ কয়েকটি দস্তাবেজের মতো নয় (যা স্বতন্ত্রভাবে সূচকযুক্ত হতে পারে না)।
কাকো-নাওয়াও

1
@ কাকো-নাওয়াও এটি সত্য, এটি কেবল emailক্ষেত্র ছাড়াই ডক্সের জন্য কাজ করে , যেখানে এটির আসলে কোনও মূল্য নেই null। আপডেট উত্তর দেখুন।
জনিএইচকে

2
অনুপস্থিত ক্ষেত্রগুলির সাথে কাজ করে না। সম্ভবত আচরণটি মঙ্গোদব পরবর্তী সংস্করণগুলিতে পরিবর্তিত হয়েছিল। উত্তর আপডেট করা উচিত।
জোনিবা

44

TL; ড

হ্যাঁ, nullঅনন্য "আসল" মান প্রয়োগ করার সময়, ক্ষেত্রটি সেট করা আছে বা সংজ্ঞায়িত নয় এমন একাধিক নথি থাকতে পারে ।

প্রয়োজনীয়তা :

  • মঙ্গোডিবি v3.2 +।
  • আপনার কংক্রিট মান প্রকার (গুলি) অগ্রিম জেনে রাখা (যেমন, সর্বদা একটি stringবা objectকখন নয় null)।

আপনি যদি বিবরণে আগ্রহী না হন তবে implementationবিভাগটি এড়িয়ে যান ।

দীর্ঘ সংস্করণ

@ নোলানের উত্তর পরিপূরক হিসাবে, মঙ্গোডিবি v3.2 দিয়ে শুরু করে আপনি একটি ফিল্টার এক্সপ্রেশন সহ আংশিক অনন্য সূচক ব্যবহার করতে পারেন।

আংশিক ফিল্টার এক্সপ্রেশনটির সীমাবদ্ধতা রয়েছে। এটি কেবল নিম্নলিখিতগুলি অন্তর্ভুক্ত করতে পারে:

  • সমতা এক্সপ্রেশন (যেমন ক্ষেত্র: মান বা $eqঅপারেটর ব্যবহার করে ),
  • $exists: true অভিব্যক্তি,
  • $gt, $gte, $lt, $lteএক্সপ্রেশন,
  • $type এক্সপ্রেশন,
  • $and কেবল শীর্ষ স্তরের অপারেটর

এর অর্থ হল তুচ্ছ প্রকাশটি {"yourField"{$ne: null}}ব্যবহার করা যাবে না।

যাইহোক, ধরে নিলাম যে আপনার ক্ষেত্র সর্বদা একই ধরণের ব্যবহার করে , আপনি একটি $typeএক্সপ্রেশন ব্যবহার করতে পারেন ।

{ field: { $type: <BSON type number> | <String alias> } }

মঙ্গোডিবি v3.6 একাধিক সম্ভাব্য ধরণের নির্দিষ্টকরণের জন্য সমর্থন যোগ করেছে, যা অ্যারে হিসাবে পাস করা যেতে পারে:

{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }

যার অর্থ এটি যখন একাধিক প্রকারের কোনওরকম হতে পারে তখন মানটি দেয় null

অতএব, আমরা যদি emailনীচের উদাহরণে ক্ষেত্রটিকে মান stringবা বলতে, binary dataমানগুলি মানতে চাই তবে একটি উপযুক্ত $typeঅভিব্যক্তি হবে:

{email: {$type: ["string", "binData"]}}

বাস্তবায়ন

নকুল

আপনি এটি একটি মঙ্গুজ স্কিমাতে নির্দিষ্ট করতে পারেন:

const UsersSchema = new Schema({
  name: {type: String, trim: true, index: true, required: true},
  email: {
    type: String, trim: true, index: {
      unique: true,
      partialFilterExpression: {email: {$type: "string"}}
    }
  }
});

বা এটি সরাসরি সংগ্রহে যোগ করুন (যা দেশীয় নোড.জেএস ড্রাইভার ব্যবহার করে):

User.collection.createIndex("email", {
  unique: true,
  partialFilterExpression: {
    "email": {
      $type: "string"
    }
  }
});

নেটিভ মংডোব ড্রাইভার

ব্যবহার collection.createIndex

db.collection('users').createIndex({
    "email": 1
  }, {
    unique: true,
    partialFilterExpression: {
      "email": {
        $type: "string"
      }
    }
  },
  function (err, results) {
    // ...
  }
);

মংডোব শেল

ব্যবহার db.collection.createIndex:

db.users.createIndex({
  "email": 1
}, {
  unique: true, 
  partialFilterExpression: {
    "email": {$type: "string"}
  }
})

এটি কোনও nullইমেল সহ, বা কোনও ইমেল ক্ষেত্র ছাড়াই একাধিক রেকর্ড সন্নিবেশ করার অনুমতি দেবে , তবে একই ইমেলের স্ট্রিং সহ নয়।


দুর্দান্ত উত্তর। তুমি একজন ত্রাণকর্তা।
r3wt

এই উত্তরটি আমার পক্ষেও হয়েছে।
ইমানুয়েল এনকে

1
এই প্রশ্নের বেশিরভাগ স্বীকৃত উত্তরের মধ্যে আপনি নিশ্চিত হয়ে যাচ্ছেন যে আপনি আপনার সূচকযুক্ত কীগুলিতে স্পষ্টভাবে নাল মান নির্ধারণ করছেন না। পরিবর্তে তারা অপরিশোধিত পাস করা হবে। আমি এটি করছি এবং এখনও ত্রুটি পেয়েছি (ব্যবহার করার সময় uniqueএবং sparse)। আমি এই জবাবটি দিয়ে আমার স্কিমা আপডেট করেছি, আমার বিদ্যমান সূচিটি বাদ দিয়েছি এবং এটি একটি কবজির মতো কাজ করেছে।
ফিল

এটির জন্য ভোট দেওয়া হয়েছে, কারণ এটি জ্ঞান এবং সবচেয়ে সাধারণ পরিস্থিতিগুলির উপর ভিত্তি করে সম্ভাব্য উত্তর সরবরাহ করে যে কোনও একটি এই স্থানে এই উত্তরের উত্তর শেষ করে। বিস্তারিত উত্তর দেওয়ার জন্য ধন্যবাদ! : +1:
অন্যকোডার

6

এই বিষয়ে যারা গবেষণা করছেন তাদের কেবলমাত্র একটি দ্রুত আপডেট।

নির্বাচিত উত্তরটি কাজ করবে তবে আপনি তার পরিবর্তে আংশিক সূচকগুলি ব্যবহার করতে পারেন।

সংস্করণ ৩.২ এ পরিবর্তিত হয়েছে: মঙ্গোডিবি ৩.২ থেকে শুরু করে মঙ্গোডিবি আংশিক সূচক তৈরির বিকল্প সরবরাহ করে। আংশিক সূচকগুলি বিরল সূচকগুলির কার্যকারিতার একটি সুপারসেট সরবরাহ করে। আপনি যদি মঙ্গোডিবি ৩.২ বা তার পরে ব্যবহার করছেন তবে বিচ্ছিন্ন সূচকের চেয়ে আংশিক সূচকগুলি পছন্দ করা উচিত।

আংশিক সূচকে আরও ডকো: https://docs.mongodb.com/manual/core/index-partial/


2

প্রকৃতপক্ষে, কেবলমাত্র প্রথম দস্তাবেজ যেখানে ক্ষেত্রের অস্তিত্ব নেই "ইমেল" সফলভাবে সংরক্ষণ করবে। পরবর্তী সময়ে সংরক্ষণ করা যেখানে "ইমেল" উপস্থিত নেই ত্রুটি দেওয়ার সময় ব্যর্থ হবে (নীচে কোড স্নিপেট দেখুন)। অনন্য সূচী এবং অনুপস্থিত কীগুলির জন্য এখানে http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes এ মঙ্গোডিবি অফিশিয়াল ডকুমেন্টেশন দেখুন ।

  // NOTE: Code to executed in mongo console.

  db.things.ensureIndex({firstname: 1}, {unique: true});
  db.things.save({lastname: "Smith"});

  // Next operation will fail because of the unique index on firstname.
  db.things.save({lastname: "Jones"});

সংজ্ঞা অনুসারে অনন্য সূচক কেবলমাত্র একবারে একটি মান সংরক্ষণ করতে দেয়। আপনি যদি নালটিকে এমন একটি মান হিসাবে বিবেচনা করেন তবে এটি কেবল একবার beোকানো যেতে পারে! আপনি আবেদন পর্যায়ে এটি নিশ্চিত করে এবং যাচাই করে আপনার পদ্ধতির মধ্যে সঠিক। এভাবেই করা যায়।

আপনি এটি পড়তে পছন্দ করতে পারেন http://www.mongodb.org/display/DOCS/Querying+ এবং+ নালস

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