মঙ্গোতে "নাল নয়" এর জন্য আপনি কীভাবে জিজ্ঞাসা করবেন?


410

আমি নিম্নলিখিত প্রশ্নের সন্ধান করতে চাই:

db.mycollection.find(HAS IMAGE URL)

সঠিক বাক্য গঠন কী হওয়া উচিত?


74
সংক্ষিপ্ত উত্তর: QUERY { field : {$ne : null} }না নাল জন্য চেক docs.mongodb.org/manual/reference/operator/query/ne
Jaider

উত্তর:


812

এটি "আইএমএজি ইউআরএল" নামক একটি কী দিয়ে সমস্ত দস্তাবেজ ফিরিয়ে দেবে, তবে তাদের এখনও একটি শূন্য মান থাকতে পারে।

db.mycollection.find({"IMAGE URL":{$exists:true}});

এটি "আইএমএজি ইউআরএল" নামে একটি কী এবং একটি নন-মান উভয়ই দিয়ে সমস্ত নথি ফিরিয়ে দেবে ।

db.mycollection.find({"IMAGE URL":{$ne:null}});

এছাড়াও, দস্তাবেজ অনুসারে, $ বিদ্যমান বর্তমানে একটি সূচক ব্যবহার করতে পারে না, তবে $ নে করতে পারে।

সম্পাদনা করুন: এই উত্তরের আগ্রহের কারণে কয়েকটি উদাহরণ যুক্ত করা হচ্ছে

এই সন্নিবেশগুলি দেওয়া:

db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});

এটি তিনটি নথি ফিরিয়ে দেবে:

db.test.find();

এটি কেবল প্রথম এবং দ্বিতীয় নথিগুলি ফিরিয়ে দেবে:

db.test.find({"check":{$exists:true}});

এটি কেবল প্রথম নথিটি ফিরিয়ে দেবে:

db.test.find({"check":{$ne:null}});

এটি কেবল দ্বিতীয় এবং তৃতীয় নথিগুলি ফিরিয়ে দেবে:

db.test.find({"check":null})

12
ডক্স অনুসারে $ne ক্ষেত্রটি অন্তর্ভুক্ত করে না এমন নথিগুলি অন্তর্ভুক্ত করে । আপনি উত্তর পোস্ট করার পরে এটি কি পরিবর্তন হয়েছে? docs.mongodb.org/manual/references/operator/query/ne
অ্যান্ড্রু মাও

2
আমি বিশ্বাস করি না যে এটি পরিবর্তিত হয়েছে। Checking নে পরীক্ষা করার সময়, মানটি সমস্ত নথিতে পরীক্ষা করা হয়, ক্ষেত্রটি অন্তর্ভুক্ত নয় এমনগুলি সহ, তবে ull ne: নাল এখনও ক্ষেত্রের অন্তর্ভুক্ত না এমন কোনও দস্তাবেজের সাথে মেলে না কারণ ক্ষেত্রের মান এখনও শূন্য রয়েছে, যদিও সেই দস্তাবেজে ক্ষেত্রটি বিদ্যমান নেই।
টিম গৌটিয়ার

2
আপনি কীভাবে দ্বিতীয় দস্তাবেজের সাথে মেলে?
বিটি

1
৩ বছর আগে আমি যখন এটি লিখেছিলাম তা রিভার যাচাই করেছিলাম এবং নিশ্চিত হওয়ার জন্য, আমি কেবল মঙ্গো ইনস্টল করে আবার চেষ্টা করেছি। এটি এখনও একইভাবে কাজ করে, উত্তরটি সঠিক। ২ য় থেকে শেষ ক্যোয়ারী কেবলমাত্র প্রথম দলিল দেয়।
টিম

1
প্রদত্ত উদাহরণগুলি এটিকে কীভাবে ব্যবহার করতে হয় তা সত্যই বোধগম্য করে। :-)
এরিক ডেলা ক্রুজ

92

একটি লাইনার সেরা:

db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });

এখানে,

মাইকোলিকেশন : আপনার পছন্দসই সংগ্রহের নাম দিন

FIELDNAME : আপনার পছন্দসই ক্ষেত্র নাম স্থান

ব্যাখ্যা:

$ বিদ্যমান : যখন সত্য হয়, $ বিদ্যমান ক্ষেত্রের নথির সাথে মেলে যেখানে ক্ষেত্রের মানটি শূন্য থাকে এমন নথি সহ। যদি এটি মিথ্যা হয় তবে ক্যোয়ারী কেবলমাত্র সেই দস্তাবেজগুলি ফিরিয়ে দেয় যা ক্ষেত্রটি ধারণ করে না।

ne ক্ষেত্রের মান নির্দিষ্ট মানের সমান নয় যেখানে নথি নির্বাচন করে। এর মধ্যে ক্ষেত্রটি অন্তর্ভুক্ত নয় এমন নথি রয়েছে।

সুতরাং আপনার প্রদত্ত ক্ষেত্রে নিম্নলিখিত প্রশ্নের সাথে ইমেজুরল ক্ষেত্রের সাথে সমস্ত দস্তাবেজ ফিরিয়ে দিতে যাচ্ছে এবং নাল মান নেই:

db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });

11
$exists: trueঅপ্রয়োজনীয়, $ne: nullযথেষ্ট।
স্টানিস্লাভ কারাখানভ

এটি সেরা উত্তর হওয়া উচিত। $exists: trueমানগুলিও ফেরত দেয় null। উভয় থাকতে হবে $exists: trueএবং $ne: null। এটি অনর্থক নয়।
ইসমাইল কাটকাঠ

47

পাইমঙ্গোতে আপনি ব্যবহার করতে পারেন:

db.mycollection.find({"IMAGE URL":{"$ne":None}});

কারণ পাইমোঙ্গো মঙ্গোকে "নাল" হিসাবে পাইথন "কিছুই নয়" হিসাবে উপস্থাপন করে।


18
db.collection_name.find({"filed_name":{$exists:true}});

এই ফাইলড নামটি ধারণ করে এমন নথিগুলি আনুন এমনকি এটি বাতিল হয়।

আমার প্রস্তাব:

db.collection_name.find({"field_name":{$type:2}}) //type:2 == String

আপনি প্রয়োজনীয় বৈশিষ্ট্যের ধরণটি পরীক্ষা করতে পারেন, এটির ক্ষেত্রের নাম অনুসারে অনুসন্ধান করা সমস্ত দস্তাবেজ ফিরিয়ে দেবে কারণ আপনি দায়েরকৃত ধরণটি পরীক্ষা করে দেখছেন যদি অন্যথায় শর্তটি মেলে না তবে কিছুই ফিরে আসবে না।

নম্বর : যদি FIELD_NAME একটি খালি স্ট্রিং যার মানে "" আছে, এটা হবে returned.It জন্য একই আচরণ

db.collection_name.find({"filed_name":{$ne:null}});

অতিরিক্ত বৈধতা:

ঠিক আছে, সুতরাং আমরা এখনও শেষ হয়নি আমাদের একটি অতিরিক্ত শর্ত প্রয়োজন।

db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})

অথবা

db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})

উল্লেখ


14

ভবিষ্যতের পাঠকদের জন্য ভাগ করে নেওয়া।

এই ক্যোয়ারীটি আমাদের জন্য কাজ করেছে ( মঙ্গোডিবি কম্পাস থেকে ক্যোয়ারী কার্যকর করা হয়েছে ):

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}

1
। $ বিদ্যমান: সত্য, $ ne: নাল correct সঠিক ফলাফল দেখায় নি। আপনার ক্যোয়ারী ভাল কাজ করে
ওলেকসান্ডার বুখেক

1
সাবধানতা অবলম্বন করুন,
often n প্রায়শই

4
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})

এটি কি বৈধ জসন নথি? ক্যোরি ডকুমেন্টে একই নামের দুটি বৈশিষ্ট্য। নিশ্চিত না যে আপনি কীভাবে মেমরিতে এটি তৈরি করবেন।
ব্রেন্টআর

4

আদর্শ ক্ষেত্রে, আপনি তিনটি মানের , নাল , "" বা খালি পরীক্ষা করতে চান (ক্ষেত্রটি রেকর্ডে নেই)

আপনি নিম্নলিখিত করতে পারেন।

db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})

3

একটি বিকল্প যা উল্লেখ করা হয়নি, তবে কারও কারও পক্ষে এটি আরও কার্যকর বিকল্প হতে পারে (এনইউএলএল এন্ট্রিগুলির সাথে কাজ করবে না) হ'ল একটি স্পারস সূচক ব্যবহার করা (ক্ষেত্রের মধ্যে কিছু থাকে তবে সূচীতে এন্ট্রি উপস্থিত থাকে)। এখানে একটি নমুনা ডেটা সেট রয়েছে:

db.foo.find()
{ "_id" : ObjectId("544540b31b5cf91c4893eb94"), "imageUrl" : "http://example.com/foo.jpg" }
{ "_id" : ObjectId("544540ba1b5cf91c4893eb95"), "imageUrl" : "http://example.com/bar.jpg" }
{ "_id" : ObjectId("544540c51b5cf91c4893eb96"), "imageUrl" : "http://example.com/foo.png" }
{ "_id" : ObjectId("544540c91b5cf91c4893eb97"), "imageUrl" : "http://example.com/bar.png" }
{ "_id" : ObjectId("544540ed1b5cf91c4893eb98"), "otherField" : 1 }
{ "_id" : ObjectId("544540f11b5cf91c4893eb99"), "otherField" : 2 }

এখন, ইমেজ ইউআরএল ফিল্ডে স্পার্স সূচক তৈরি করুন:

db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

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

db.foo.find({}, {_id : 0, imageUrl : 1})
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
{ "imageUrl" : "http://example.com/bar.png" }
{  }
{  }

ঠিক আছে, সুতরাং অতিরিক্ত ডকুমেন্টগুলি imageUrlফিরিয়ে দেওয়া হচ্ছে না, খালি, আমরা যা চাইছিলাম তা নয়। কেবল তা নিশ্চিত করার জন্য, একটি ব্যাখ্যা করুন:

db.foo.find({}, {_id : 0, imageUrl : 1}).explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 6,
    "nscannedObjects" : 6,
    "nscanned" : 6,
    "nscannedObjectsAllPlans" : 6,
    "nscannedAllPlans" : 6,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "server" : "localhost:31100",
    "filterSet" : false
}

সুতরাং, হ্যাঁ, একটি BasicCursorটেবিল স্ক্যানের সমান, এটি সূচকটি ব্যবহার করে না। আসুন প্রশ্নের সাথে আমাদের স্পার্স সূচকটি ব্যবহার করতে বলি hint():

db.foo.find({}, {_id : 0, imageUrl : 1}).hint({imageUrl : 1})
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/bar.png" }
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }

এবং ফলাফলটি আমরা সন্ধান করছিলাম - জনবহুল ক্ষেত্র সহ কেবলমাত্র নথিই ফিরে আসবে। এটি কেবল সূচকটিও ব্যবহার করে (অর্থাত এটি একটি আচ্ছাদিত সূচক ক্যোয়ারী), সুতরাং ফলাফলগুলি ফেরত দেওয়ার জন্য কেবল সূচকের স্মৃতিতে থাকা দরকার।

এটি একটি বিশেষ ব্যবহারের ক্ষেত্রে এবং সাধারণত ব্যবহার করা যায় না (এই বিকল্পগুলির জন্য অন্যান্য উত্তর দেখুন)। বিশেষত এটি লক্ষ করা উচিত যে জিনিসগুলি যেমন দাঁড়ায় আপনি count()এইভাবে ব্যবহার করতে পারবেন না (আমার উদাহরণস্বরূপ এটি 4 না হয়ে 6 এ ফিরে আসবে), সুতরাং দয়া করে কেবল উপযুক্ত হলেই ব্যবহার করুন।


পাঠ্য ক্ষেত্রগুলি সর্বদা বিরল সূচক হয়, আপনাকে এগুলি স্পষ্টভাবে নির্দিষ্ট করতে হবে না। শুধু আমার 2 সেন্ট।
alianos-

3

মঙ্গো কম্পাসে কলামটির অস্তিত্ব যাচাই করার সহজ উপায় হ'ল:

{ 'column_name': { $exists: true } }

1
এটির সাথে সমস্যাটি হ'ল এটি ধরে নেয় যে মাঠটি সত্যই সত্যই কখনও স্থির ছিল না, তবে ওপি মনে করে (শিরোনাম থেকে) বোঝা যাচ্ছে যে এটি বিদ্যমান থাকতে পারে তবে স্পষ্টভাবে বাতিল হয়ে যেতে পারে।
ক্যারিগান

-10

প্রশ্ন হবে

db.mycollection.find({"IMAGE URL":{"$exists":"true"}})

এটি "চিত্রের URL টি" থাকা সমস্ত দস্তাবেজকে কী হিসাবে ফিরিয়ে দেবে ...........


1
@ কিলিয়ান্যাক এটি সত্য নয় $ বিদ্যমান নাল মানগুলিও ক্যাপচার করবে। ডকস.মোংডব.অর্গ
ম্যানুয়াল /

@ দারভাক ঠিক এই কারণেই প্রশ্নটিতে ব্যবহারের ক্ষেত্রে সন্তুষ্ট হবে না।
কিলিয়ান্ক

এই উত্তরটি ভুল কারণ $existsকীটি পরীক্ষা "IMAGE URL"করে এটির মান ( null) মনে করে না এবং এটির সাথে একটি দস্তাবেজ ফিরিয়ে দেবে"IMAGE URL" : null
ডেভিড হরিরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.