মংগুজ _আইডি এবং স্ট্রিংগুলির সাথে তুলনা করা


197

আমার কাছে একটি নোড.জেএস অ্যাপ্লিকেশন রয়েছে যা কিছু তথ্য টেনে এনে এটি কোনও বস্তুর মধ্যে আটকে দেয়:

var results = new Object();

User.findOne(query, function(err, u) {
    results.userId = u._id;
}

আমি যখন সঞ্চিত আইডির উপর ভিত্তি করে একটি / যদি করি তখন তুলনাটি কখনই সত্য হয় না:

if (results.userId == AnotherMongoDocument._id) {
    console.log('This is never true');
}

আমি যখন দুটি আইডির একটি কনসোল.লগ করি, তখন তাদের ঠিক মিল হয়:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

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

উত্তর:


359

মঙ্গুজ মঙ্গোদব-নেটিভ ড্রাইভার ব্যবহার করে যা কাস্টম অবজেক্টআইডি টাইপ ব্যবহার করে। আপনি .equals()পদ্ধতির সাথে অবজেক্টআইডিগুলি তুলনা করতে পারেন । আপনার উদাহরণ সহ results.userId.equals(AnotherMongoDocument._id),। toString()আপনি যদি JSON ফর্ম্যাটে অবজেক্টের একটি স্ট্রিংযুক্ত সংস্করণ বা কুকি সংরক্ষণ করতে চান তবে অবজেক্টআইডি টাইপের একটি পদ্ধতিও রয়েছে ।

যদি আপনি ব্যবহার করেন ObjectID = require("mongodb").ObjectID(মংডোব-নেটিভ লাইব্রেরির প্রয়োজন হয়) আপনি results.userIdবৈধ সনাক্তকারী কিনা তা পরীক্ষা করতে পারেন results.userId instanceof ObjectID

প্রভৃতি


13
এর জন্য দস্তাবেজগুলি .equals(): mongodb.github.io/node-mongodb-native/api-bson-generated/…
অ্যান্টনি পানোজো

4
আপনি যদি ইতিমধ্যে ব্যবহার করে থাকেন তবে mongooseকেবল require('mongoose').mongo.ObjectIDকোনও অতিরিক্ত নির্ভরতার তালিকা তৈরি করতে হবে না
জোশুয়া ডেভিড

62

ObjectIDগুলি হ'ল অবজেক্টস তাই আপনি যদি তাদের সাথে কেবল ==তাদের উল্লেখগুলি তুলনা করে তুলনা করেন। আপনি যদি তাদের মানগুলির তুলনা করতে চান তবে আপনাকে এই ObjectID.equalsপদ্ধতিটি ব্যবহার করতে হবে :

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}

17

স্ট্রিং অবজেক্ট আইডি রূপান্তর (toString () পদ্ধতি ব্যবহার করে) কাজ করবে।


8

গৃহীত উত্তরগুলি সত্যই আপনার কোড সহ আপনি কি করতে পারেন তা সীমাবদ্ধ করে। উদাহরণস্বরূপ, আপনি Object Idsসমান পদ্ধতিটি ব্যবহার করে কোনও অ্যারে অনুসন্ধান করতে সক্ষম হবেন না । পরিবর্তে, কীগুলি সবসময় স্ট্রিংয়ের সাথে কাস্ট করা এবং তুলনা করা আরও বেশি অর্থবোধ করে।

indexOf()নির্দিষ্ট আইডির জন্য রেফারেন্সের অ্যারের মধ্যে যদি আপনাকে পরীক্ষা করতে প্রয়োজন হয় তবে ক্ষেত্রে এখানে উদাহরণের উত্তর দেওয়া আছে । ধরে নিন queryএমন একটি ক্যোয়ারী যা আপনি someModelচালাচ্ছেন , ধরে নিন আপনি যে আইডিটি খুঁজছেন তার জন্য একটি মঙ্গো মডেল এবং অবশেষে ধরে নিন results.idListযে ক্ষেত্রটি আপনি আপনার অবজেক্ট আইডিতে সন্ধান করছেন।

query.exec(function(err,results){
   var array = results.idList.map(function(v){ return v.toString(); });
   var exists = array.indexOf(someModel._id.toString()) >= 0;
   console.log(exists);
});

1
বা এক-লাইনের:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko

4
@ জ্লাটকো আমি নতুন সিনট্যাক্সের বড় ভক্ত নই তবে প্রত্যেকের নিজের নিজস্ব।
r3wt

2
@ জ্ল্যাটকো const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) বা const exists = results.idList.some(val => val.equals(someModel._id))
axanpi

1
এই সমস্ত বছর পরে জ্লাতকো, এবং অনুমান করুন। আমি এখন আপনার সংস্করণ পছন্দ। মন যদি আমি আমার উত্তরে এটি সঠিক যুক্তি দিয়ে যুক্ত করি?
r3wt

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

6

উপরের মতানুসারে, আমি সমস্যাটি সমাধানের তিনটি উপায় পেয়েছি।

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

0

আমি ঠিক একই সমস্যার মুখোমুখি হয়েছি এবং আমি নিম্নলিখিতটির সাহায্যে সমস্যাটি সহজভাবে সমাধান করেছি JSON.stringify(): -

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}

0

এখানে সুপারিশ করা তিনটি সম্ভাব্য সমাধানের বিভিন্ন ব্যবহারের ক্ষেত্রে রয়েছে।

  1. এই জাতীয় দুটি মঙ্গো ডকুমেন্টে অবজেক্টআইডি তুলনা করার সময় .equals ব্যবহার করুন

    results.userId.equals (AnotherMongoDocument._id)

  2. মোংগো ডকুমেন্টের একটি অবজেক্টের সাথে অবজেক্টআইডিটির একটি স্ট্রিং প্রতিনিধিত্বের তুলনা করার সময় .toString () ব্যবহার করুন। এটার মত

    ফলাফল.userId === আরেকটি মঙ্গো ডকুমেন্ট._id.to স্ট্রিং ()


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