মন্টোডিবি রেকর্ড সন্ধান করুন যেখানে অ্যারে ক্ষেত্রটি খালি নয়


502

আমার সমস্ত রেকর্ডের "চিত্র" নামে একটি ক্ষেত্র রয়েছে। এই ক্ষেত্রটি স্ট্রিংগুলির একটি অ্যারে।

আমি এখন নতুন 10 টি রেকর্ড চাই যেখানে এই অ্যারেটি খালি নেই।

আমি প্রায় googled, কিন্তু আশ্চর্যের বিষয় যথেষ্ট আমি এই খুব খুঁজে পাই না। আমি $ যেখানে বিকল্পটি পড়েছি, কিন্তু আমি ভাবছিলাম যে দেশীয় ফাংশনগুলির তুলনায় এটি কতটা ধীর এবং এর থেকে আরও ভাল সমাধান থাকলে।

এবং তারপরেও, এটি কার্যকর হয় না:

ME.find({$where: 'this.pictures.length > 0'}).sort('-created').limit(10).execFind()

কিছুই দেয় না this.picturesদৈর্ঘ্যের বিট ছাড়াই ছেড়ে দেওয়া কাজ করে তবে তা অবশ্যই খালি রেকর্ডগুলি দেয় returns

উত্তর:


827

যদি আপনার কাছে এমন ডকুমেন্টও থাকে যা কী না থাকে তবে আপনি ব্যবহার করতে পারেন:

ME.find({ pictures: { $exists: true, $not: {$size: 0} } })

O আকার জড়িত থাকলে মঙ্গোডিবি সূচকগুলি ব্যবহার করবে না, সুতরাং এখানে আরও ভাল সমাধান রয়েছে:

ME.find({ pictures: { $exists: true, $ne: [] } })

মোংগোডিবি ২.6 প্রকাশের পরে, আপনি অপারেটরের সাথে তুলনা করতে পারবেন $gtতবে অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যেতে পারেন (আপনি এই উত্তরে বিশদ বিবরণ পেতে পারেন ):

ME.find({ pictures: { $gt: [] } })

6
আমার কাছে এটি সঠিক পদ্ধতির, যেহেতু এটি নিশ্চিত করে যে অ্যারেটি বিদ্যমান এবং খালি নেই।
LeandroCR

আমি কীভাবে একই কার্যকারিতা অর্জন করতে পারিmongoengine
রোহিত খাত্রি

54
সাবধান হন, ME.find({ pictures: { $gt: [] } }), বিপজ্জনক নতুন MongoDB সংস্করণে এমনকি। আপনার তালিকার ক্ষেত্রে যদি আপনার একটি সূচক থাকে এবং সেই সূত্রটি ক্যোয়ারির সময় ব্যবহার করা হয়, আপনি অপ্রত্যাশিত ফলাফল পাবেন get উদাহরণস্বরূপ: db.doc.find({'nums': { $gt: [] }}).hint({ _id: 1 }).count()রিটার্ন করার সময় সঠিক সংখ্যাটি db.doc.find({'nums': { $gt: [] }}).hint({ nums: 1 }).count()দেয় 0
wojcikstefan

1
কেন এই আপনার জন্য কাজ নাও করতে পারে জানতে নিচের আমার বিস্তারিত উত্তর দেখুন stackoverflow.com/a/42601244/1579058
wojcikstefan

6
@ wojcikstefan এর মন্তব্যটি সর্বশেষ পরামর্শটি ব্যবহার করা থেকে বিরত রাখতে জনগণের প্রতিরোধ করা দরকার যা সত্যিকার অর্থে নির্দিষ্ট পরিস্থিতিতে ম্যাচের নথি ফেরত দেয় না।
থমাস জং

181

আরও কিছুটা দেখার পরে, বিশেষত মংডাব ডকুমেন্টগুলিতে, এবং বিস্মিত বিটগুলি একসাথে করার পরে, এই উত্তরটি ছিল:

ME.find({pictures: {$exists: true, $not: {$size: 0}}})

27
এটি কাজ করে না। আমি জানি না এটি আগে কাজ করেছে কিনা তবে এটি 'ছবি' কী ব্যবহার করে না এমন বস্তুগুলিও ফিরিয়ে আনবে।
rdsoze

17
অবিশ্বাস্য কিভাবে এই উত্তর 63 upvotes যখন আসলে কি @rdsoze বলেন সত্য আছে - ক্যোয়ারী এছাড়াও রেকর্ডগুলি ফিরে আসবে না আছে picturesক্ষেত্র।
ড্যান ড্যাসকলেসকু

5
সতর্কতা অবলম্বন করুন, $ আকার জড়িত লিঙ্কটি যুক্ত করা থাকলে মঙ্গোডিবি সূচকগুলি ব্যবহার করবে না । {$ Ne: []} এবং সম্ভবত {$ ne: নাল include অন্তর্ভুক্ত করা ভাল}
লেভেন্তে ডবসন

17
প্রশ্নের উত্তর প্রথম পর্বে @rdsoze বলেছে "আমার সমস্ত রেকর্ডে" চিত্র "নামে একটি ক্ষেত্র রয়েছে This এই ক্ষেত্রটি একটি অ্যারে" । আরও কি, এটি নিখুঁত বাস্তব এবং সাধারণ দৃশ্য common এই উত্তরটি ভুল নয়, লিখিত হিসাবে এটি প্রশ্নের জন্য নির্ভুলভাবে কাজ করে, এবং এটি একটি পৃথক সমস্যার সমাধান করে না এই বিষয়টির জন্য এটি সমালোচনা বা ডাউনচোট করা বোকামি।
মার্ক অ্যামেরি

1
@ সিইসি সমস্ত ডকুমেন্টেশন বলছে যে আপনি যদি কোয়েরিতে $ আকার ব্যবহার করেন তবে এটি আপনাকে দ্রুত ফলাফল দেওয়ার জন্য কোনও সূচক ব্যবহার করবে না। সুতরাং যদি আপনার সেই ক্ষেত্রটিতে একটি সূচক থাকে এবং আপনি এটি ব্যবহার করতে চান তবে appro $ ne: []} এর মতো অন্যান্য পদ্ধতির সাথে লেগে থাকুন, যদি এটি আপনার পক্ষে কাজ করে তবে তা আপনার সূচকটি ব্যবহার করবে।
লেভেন্তে ডবসন

108

এটি আপনার পক্ষেও কাজ করতে পারে:

ME.find({'pictures.0': {$exists: true}});

2
নিস! এটি আপনাকে সর্বনিম্ন আকারের জন্যও পরীক্ষা করতে দেয়। আপনি কি জানেন যে অ্যারেগুলি সর্বদা অনুক্রমিকভাবে তালিকাবদ্ধ করা হয়? সেখানে কি এমন কোন ঘটনা pictures.2ঘটতে পারে যেখানে উপস্থিত রয়েছে তবে pictures.1তা নেই?
আনুশার

2
$existsঅপারেটর একটি বুলিয়ান, কোনো অফসেট হয়। @tenbatsu এর trueপরিবর্তে ব্যবহার করা উচিত 1
একিলবি

2
@ আনুশর Would there ever be a case where pictures.2 exists but pictures.1 does not? হ্যাঁ, ঘটনাটি ঘটতে পারে।
Bndr

@TheBndr কেবল তখনই ঘটতে পারে যদি picturesসাব-ডক হয়, অ্যারে না হয়। যেমনpictures: {'2': 123}
জননিএইচকে

4
এটি দুর্দান্ত এবং স্বজ্ঞাত, তবে যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় তবে সাবধান হন - এটি আপনার কোনও সূচক না থাকলেও এটি একটি সম্পূর্ণ সংগ্রহের স্ক্যান করবে pictures
wojcikstefan

35

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

টিএল; ডিআর db.doc.find({ nums: { $gt: -Infinity }})দ্রুততম এবং সবচেয়ে নির্ভরযোগ্য (কমপক্ষে আমি পরীক্ষিত মঙ্গোডিবি সংস্করণে)।

সম্পাদনা: এটি আর মঙ্গোডিবি v3.6 এ কাজ করে না! একটি সম্ভাব্য সমাধানের জন্য এই পোস্টের অধীনে মন্তব্যগুলি দেখুন।

সেটআপ

আমি 1k ডক্স ডাব্লু / ওএ তালিকা ক্ষেত্র, খালি তালিকার সাথে 1 কে ডকস, এবং খালি নয় খালি তালিকার সাথে 5 টি ডক .ুকিয়েছি।

for (var i = 0; i < 1000; i++) { db.doc.insert({}); }
for (var i = 0; i < 1000; i++) { db.doc.insert({ nums: [] }); }
for (var i = 0; i < 5; i++) { db.doc.insert({ nums: [1, 2, 3] }); }
db.doc.createIndex({ nums: 1 });

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

টেস্ট

db.doc.find({'nums': {'$exists': true}}) ভুল ফলাফল দেয় (আমরা কী অর্জনের জন্য চেষ্টা করছি)।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': {'$exists': true}}).count()
1005

-

db.doc.find({'nums.0': {'$exists': true}})সঠিক ফলাফলগুলি ফেরত দেয় তবে সম্পূর্ণ সংগ্রহের স্ক্যান ব্যবহার করে এটি ধীর হয় ( COLLSCANব্যাখ্যাটিতে বিজ্ঞপ্তি পর্যায়) stage

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums.0': {'$exists': true}}).count()
5
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums.0': {'$exists': true}}).explain()
{
  "queryPlanner": {
    "plannerVersion": 1,
    "namespace": "test.doc",
    "indexFilterSet": false,
    "parsedQuery": {
      "nums.0": {
        "$exists": true
      }
    },
    "winningPlan": {
      "stage": "COLLSCAN",
      "filter": {
        "nums.0": {
          "$exists": true
        }
      },
      "direction": "forward"
    },
    "rejectedPlans": [ ]
  },
  "serverInfo": {
    "host": "MacBook-Pro",
    "port": 27017,
    "version": "3.0.14",
    "gitVersion": "08352afcca24bfc145240a0fac9d28b978ab77f3"
  },
  "ok": 1
}

-

db.doc.find({'nums': { $exists: true, $gt: { '$size': 0 }}})ভুল ফলাফল দেয়। এটি কোনও অকার্যকর সূচি স্ক্যান কোনও নথির অগ্রগতির কারণে। এটি সূচক ছাড়া সঠিক হতে পারে তবে ধীর হবে।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $exists: true, $gt: { '$size': 0 }}}).count()
0
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $exists: true, $gt: { '$size': 0 }}}).explain('executionStats').executionStats.executionStages
{
  "stage": "KEEP_MUTATIONS",
  "nReturned": 0,
  "executionTimeMillisEstimate": 0,
  "works": 2,
  "advanced": 0,
  "needTime": 0,
  "needFetch": 0,
  "saveState": 0,
  "restoreState": 0,
  "isEOF": 1,
  "invalidates": 0,
  "inputStage": {
    "stage": "FETCH",
    "filter": {
      "$and": [
        {
          "nums": {
            "$gt": {
              "$size": 0
            }
          }
        },
        {
          "nums": {
            "$exists": true
          }
        }
      ]
    },
    "nReturned": 0,
    "executionTimeMillisEstimate": 0,
    "works": 1,
    "advanced": 0,
    "needTime": 0,
    "needFetch": 0,
    "saveState": 0,
    "restoreState": 0,
    "isEOF": 1,
    "invalidates": 0,
    "docsExamined": 0,
    "alreadyHasObj": 0,
    "inputStage": {
      "stage": "IXSCAN",
      "nReturned": 0,
      "executionTimeMillisEstimate": 0,
      "works": 1,
      "advanced": 0,
      "needTime": 0,
      "needFetch": 0,
      "saveState": 0,
      "restoreState": 0,
      "isEOF": 1,
      "invalidates": 0,
      "keyPattern": {
        "nums": 1
      },
      "indexName": "nums_1",
      "isMultiKey": true,
      "direction": "forward",
      "indexBounds": {
        "nums": [
          "({ $size: 0.0 }, [])"
        ]
      },
      "keysExamined": 0,
      "dupsTested": 0,
      "dupsDropped": 0,
      "seenInvalidated": 0,
      "matchTested": 0
    }
  }
}

-

db.doc.find({'nums': { $exists: true, $not: { '$size': 0 }}})সঠিক ফলাফল দেয়, কিন্তু কর্মক্ষমতা খারাপ। এটি প্রযুক্তিগতভাবে একটি সূচক স্ক্যান করে, তবে তারপরেও এটি সমস্ত ডক্সকে অগ্রসর করে এবং তারপরে সেগুলি ফিল্টার করতে হয়)।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $exists: true, $not: { '$size': 0 }}}).count()
5
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $exists: true, $not: { '$size': 0 }}}).explain('executionStats').executionStats.executionStages
{
  "stage": "KEEP_MUTATIONS",
  "nReturned": 5,
  "executionTimeMillisEstimate": 0,
  "works": 2016,
  "advanced": 5,
  "needTime": 2010,
  "needFetch": 0,
  "saveState": 15,
  "restoreState": 15,
  "isEOF": 1,
  "invalidates": 0,
  "inputStage": {
    "stage": "FETCH",
    "filter": {
      "$and": [
        {
          "nums": {
            "$exists": true
          }
        },
        {
          "$not": {
            "nums": {
              "$size": 0
            }
          }
        }
      ]
    },
    "nReturned": 5,
    "executionTimeMillisEstimate": 0,
    "works": 2016,
    "advanced": 5,
    "needTime": 2010,
    "needFetch": 0,
    "saveState": 15,
    "restoreState": 15,
    "isEOF": 1,
    "invalidates": 0,
    "docsExamined": 2005,
    "alreadyHasObj": 0,
    "inputStage": {
      "stage": "IXSCAN",
      "nReturned": 2005,
      "executionTimeMillisEstimate": 0,
      "works": 2015,
      "advanced": 2005,
      "needTime": 10,
      "needFetch": 0,
      "saveState": 15,
      "restoreState": 15,
      "isEOF": 1,
      "invalidates": 0,
      "keyPattern": {
        "nums": 1
      },
      "indexName": "nums_1",
      "isMultiKey": true,
      "direction": "forward",
      "indexBounds": {
        "nums": [
          "[MinKey, MaxKey]"
        ]
      },
      "keysExamined": 2015,
      "dupsTested": 2015,
      "dupsDropped": 10,
      "seenInvalidated": 0,
      "matchTested": 0
    }
  }
}

-

db.doc.find({'nums': { $exists: true, $ne: [] }})সঠিক ফলাফল দেয় এবং কিছুটা দ্রুত, তবে কর্মক্ষমতাটি এখনও আদর্শ নয়। এটি IXSCAN ব্যবহার করে যা কেবলমাত্র বিদ্যমান তালিকার ক্ষেত্রের সাথে ডক্সকে অগ্রসর করে তবে তার পরে খালি তালিকা একের পর এক ফিল্টার করতে হয়।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $exists: true, $ne: [] }}).count()
5
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $exists: true, $ne: [] }}).explain('executionStats').executionStats.executionStages
{
  "stage": "KEEP_MUTATIONS",
  "nReturned": 5,
  "executionTimeMillisEstimate": 0,
  "works": 1018,
  "advanced": 5,
  "needTime": 1011,
  "needFetch": 0,
  "saveState": 15,
  "restoreState": 15,
  "isEOF": 1,
  "invalidates": 0,
  "inputStage": {
    "stage": "FETCH",
    "filter": {
      "$and": [
        {
          "$not": {
            "nums": {
              "$eq": [ ]
            }
          }
        },
        {
          "nums": {
            "$exists": true
          }
        }
      ]
    },
    "nReturned": 5,
    "executionTimeMillisEstimate": 0,
    "works": 1017,
    "advanced": 5,
    "needTime": 1011,
    "needFetch": 0,
    "saveState": 15,
    "restoreState": 15,
    "isEOF": 1,
    "invalidates": 0,
    "docsExamined": 1005,
    "alreadyHasObj": 0,
    "inputStage": {
      "stage": "IXSCAN",
      "nReturned": 1005,
      "executionTimeMillisEstimate": 0,
      "works": 1016,
      "advanced": 1005,
      "needTime": 11,
      "needFetch": 0,
      "saveState": 15,
      "restoreState": 15,
      "isEOF": 1,
      "invalidates": 0,
      "keyPattern": {
        "nums": 1
      },
      "indexName": "nums_1",
      "isMultiKey": true,
      "direction": "forward",
      "indexBounds": {
        "nums": [
          "[MinKey, undefined)",
          "(undefined, [])",
          "([], MaxKey]"
        ]
      },
      "keysExamined": 1016,
      "dupsTested": 1015,
      "dupsDropped": 10,
      "seenInvalidated": 0,
      "matchTested": 0
    }
  }
}

-

db.doc.find({'nums': { $gt: [] }})সূচকটি ইন্ডেক্স থেকে এটি ব্যবহার না করেই অনিষ্টিত ফলাফল প্রদান করতে পারে ANG এটি কোনও অবৈধ সূচক স্ক্যানের কারণে যা কোনও নথির অগ্রগতি করে না।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $gt: [] }}).count()
0
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $gt: [] }}).hint({ nums: 1 }).count()
0
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $gt: [] }}).hint({ _id: 1 }).count()
5

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $gt: [] }}).explain('executionStats').executionStats.executionStages
{
  "stage": "KEEP_MUTATIONS",
  "nReturned": 0,
  "executionTimeMillisEstimate": 0,
  "works": 1,
  "advanced": 0,
  "needTime": 0,
  "needFetch": 0,
  "saveState": 0,
  "restoreState": 0,
  "isEOF": 1,
  "invalidates": 0,
  "inputStage": {
    "stage": "FETCH",
    "filter": {
      "nums": {
        "$gt": [ ]
      }
    },
    "nReturned": 0,
    "executionTimeMillisEstimate": 0,
    "works": 1,
    "advanced": 0,
    "needTime": 0,
    "needFetch": 0,
    "saveState": 0,
    "restoreState": 0,
    "isEOF": 1,
    "invalidates": 0,
    "docsExamined": 0,
    "alreadyHasObj": 0,
    "inputStage": {
      "stage": "IXSCAN",
      "nReturned": 0,
      "executionTimeMillisEstimate": 0,
      "works": 1,
      "advanced": 0,
      "needTime": 0,
      "needFetch": 0,
      "saveState": 0,
      "restoreState": 0,
      "isEOF": 1,
      "invalidates": 0,
      "keyPattern": {
        "nums": 1
      },
      "indexName": "nums_1",
      "isMultiKey": true,
      "direction": "forward",
      "indexBounds": {
        "nums": [
          "([], BinData(0, ))"
        ]
      },
      "keysExamined": 0,
      "dupsTested": 0,
      "dupsDropped": 0,
      "seenInvalidated": 0,
      "matchTested": 0
    }
  }
}

-

db.doc.find({'nums.0’: { $gt: -Infinity }}) সঠিক ফলাফল প্রদান করে, তবে খারাপ পারফরম্যান্স রয়েছে (সম্পূর্ণ সংগ্রহের স্ক্যান ব্যবহার করে)।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums.0': { $gt: -Infinity }}).count()
5
MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums.0': { $gt: -Infinity }}).explain('executionStats').executionStats.executionStages
{
  "stage": "COLLSCAN",
  "filter": {
    "nums.0": {
      "$gt": -Infinity
    }
  },
  "nReturned": 5,
  "executionTimeMillisEstimate": 0,
  "works": 2007,
  "advanced": 5,
  "needTime": 2001,
  "needFetch": 0,
  "saveState": 15,
  "restoreState": 15,
  "isEOF": 1,
  "invalidates": 0,
  "direction": "forward",
  "docsExamined": 2005
}

-

db.doc.find({'nums': { $gt: -Infinity }})আশ্চর্যজনকভাবে, এটি খুব ভাল কাজ করে! এটি সঠিক ফলাফল দেয় এবং এটি দ্রুত, সূচক স্ক্যান পর্যায়ে 5 টি ডক্স অগ্রসর করে।

MacBook-Pro(mongod-3.0.14) test> db.doc.find({'nums': { $gt: -Infinity }}).explain('executionStats').executionStats.executionStages
{
  "stage": "FETCH",
  "nReturned": 5,
  "executionTimeMillisEstimate": 0,
  "works": 16,
  "advanced": 5,
  "needTime": 10,
  "needFetch": 0,
  "saveState": 0,
  "restoreState": 0,
  "isEOF": 1,
  "invalidates": 0,
  "docsExamined": 5,
  "alreadyHasObj": 0,
  "inputStage": {
    "stage": "IXSCAN",
    "nReturned": 5,
    "executionTimeMillisEstimate": 0,
    "works": 15,
    "advanced": 5,
    "needTime": 10,
    "needFetch": 0,
    "saveState": 0,
    "restoreState": 0,
    "isEOF": 1,
    "invalidates": 0,
    "keyPattern": {
      "nums": 1
    },
    "indexName": "nums_1",
    "isMultiKey": true,
    "direction": "forward",
    "indexBounds": {
      "nums": [
        "(-inf.0, inf.0]"
      ]
    },
    "keysExamined": 15,
    "dupsTested": 15,
    "dupsDropped": 10,
    "seenInvalidated": 0,
    "matchTested": 0
  }
}

আপনার @ wjcikstefan খুব বিস্তারিত উত্তরের জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে, আপনার প্রস্তাবিত সমাধানটি আমার ক্ষেত্রে কার্যকর বলে মনে হচ্ছে না। আমার কাছে 2 মি ডকুমেন্ট সহ একটি মঙ্গোডিবি 3.6.4 সংগ্রহ রয়েছে, তাদের বেশিরভাগের seen_eventsস্ট্রিং অ্যারে রয়েছে, যা সূচকযুক্ত। দিয়ে অনুসন্ধান করা { $gt: -Infinity }, আমি সঙ্গে সঙ্গে 0 টি নথি পেয়েছি। ব্যবহার { $exists: true, $ne: [] }: অনেক সময় নষ্ট হচ্ছে, আমি সম্ভাবনা বেশি 1,2m দস্তাবেজ পান আনা পর্যায় gist.github.com/N-Coder/b9e89a925e895c605d84bfeed648d82c
NCode

এটা তোলে ডান @Ncode মনে হচ্ছে আপনি - MongoDB v3.6 এই আর কাজ :( আমি কয়েক মিনিটের জন্য এটি দিয়ে প্রায় অভিনয় এবং এখানে আমি কী পেয়েছি: 1. db.test_collection.find({"seen_events.0": {$exists: true}})খারাপ কারণ এটি একটি সংগ্রহ স্ক্যান ব্যবহার করে 2.। db.test_collection.find({seen_events: {$exists: true, $ne: []}})হয় । খারাপ কারণ এর IXSCAN সব কাগজপত্র সাথে মিলে যায় এবং তারপর ফিল্টারিং ধীর আনা পর্যায়ে সঞ্চালিত হয় 3. একই জন্য যায় db.test_collection.find({seen_events: {$exists: true, $not: {$size: 0}}})4. অন্যান্য সমস্ত প্রশ্নের অবৈধ ফলাফল শূণ্য।।
wojcikstefan

1
@ এনকোড একটি সমাধান খুঁজে পেয়েছে! আপনি নিশ্চিত যে সমস্ত অ-খালি হন, তাহলে seen_eventsস্ট্রিং ধারণ, আপনি এই ব্যবহার করতে পারেন: db.test_collection.find({seen_events: {$gt: ''}}).count()। এটি ভাল সম্পাদন করে তা নিশ্চিত করতে, পরীক্ষা করে দেখুন db.test_collection.find({seen_events: {$gt: ''}}).explain(true).executionStats। আপনি সম্ভবত পারেন প্রয়োগ যে দেখানো ইভেন্টগুলি স্কিমা বৈধতার মাধ্যমে স্ট্রিংগুলি রয়েছে: ডকস.মংডোব
ম্যানুয়াল

ধন্যবাদ! সমস্ত বিদ্যমান মানগুলি স্ট্রিং তাই আমি এটি চেষ্টা করে দেখতে পারি। মোঙ্গোডিবি বাগট্র্যাকারে এই সমস্যাটি নিয়ে আলোচনা করার একটি বাগ রয়েছে: jira.mongodb.org/browse/SERVER-26655
এনকোড

30

২.6 রিলিজ দিয়ে শুরু করে, এর আরেকটি উপায় হল ক্ষেত্রটি একটি খালি অ্যারের সাথে তুলনা করা:

ME.find({pictures: {$gt: []}})

শেলের মধ্যে এটি পরীক্ষা করে দেখুন:

> db.ME.insert([
{pictures: [1,2,3]},
{pictures: []},
{pictures: ['']},
{pictures: [0]},
{pictures: 1},
{foobar: 1}
])

> db.ME.find({pictures: {$gt: []}})
{ "_id": ObjectId("54d4d9ff96340090b6c1c4a7"), "pictures": [ 1, 2, 3 ] }
{ "_id": ObjectId("54d4d9ff96340090b6c1c4a9"), "pictures": [ "" ] }
{ "_id": ObjectId("54d4d9ff96340090b6c1c4aa"), "pictures": [ 0 ] }

সুতরাং এটিতে সঠিকভাবে ডক্স অন্তর্ভুক্ত রয়েছে যেখানে picturesকমপক্ষে একটি অ্যারে উপাদান রয়েছে এবং ডকগুলি বাদ দেয় যেখানে picturesহয় খালি অ্যারে হয়, অ্যারে নয় বা অনুপস্থিত থাকে।


7
যত্নবান এই উত্তরটি আপনাকে সমস্যা দিতে পারে যদি আপনি সূচকগুলি ব্যবহার করার চেষ্টা করেন। করছেন db.ME.createIndex({ pictures: 1 })এবং তারপরে db.ME.find({pictures: {$gt: []}})শূন্য ফলাফলগুলি ফিরিয়ে আনবেন, কমপক্ষে মোঙ্গোডিবি v3.0.14 এ
wojcikstefan

পছন্দ করুন এটি একটি নতুন চেহারা নেওয়া প্রয়োজন।
জনিএইচকে

5

এটি অর্জনের জন্য আপনি নীচের যে কোনওটি ব্যবহার করতে পারেন।
উভয়ই অনুরূপ কী নেই এমন বস্তুর জন্য ফলাফল ফেরৎ না দেওয়ার বিষয়ে যত্নবান:

db.video.find({pictures: {$exists: true, $gt: {$size: 0}}})
db.video.find({comments: {$exists: true, $not: {$size: 0}}})

4

সমস্ত এবং কেবলমাত্র ডকুমেন্টগুলি পুনরুদ্ধার করুন যেখানে 'ছবি' একটি অ্যারে এবং খালি নয়

ME.find({pictures: {$type: 'array', $ne: []}})

যদি 3.2 এর আগে একটি মঙ্গোডিবি সংস্করণ ব্যবহার $type: 4করা হয় তবে এর পরিবর্তে ব্যবহার করুন $type: 'array'। লক্ষ্য করুন যে এই সমাধানটি এমনকি $ আকার ব্যবহার করে না , সুতরাং সূচীগুলির সাথে কোনও সমস্যা নেই ("কোয়েরিগুলি কোয়েরির $ আকারের অংশের জন্য সূচকগুলি ব্যবহার করতে পারে না")

এগুলি সহ অন্যান্য সমাধানগুলি (স্বীকৃত উত্তর):

এমইফাইন্ড ({ছবি: {$ বিদ্যমান: সত্য, $ নয়: {$ আকার: 0}}}); এমইফাইন্ড ({ছবি: {$ বিদ্যমান: সত্য, $ নে: []}})

হয় ভুল কারণ তারা, এমনকি যদি কাগজপত্র আসতে উদাহরণস্বরূপ, ছবিগুলি 'হল null, undefined, 0, ইত্যাদি


2

$elemMatchঅপারেটরটি ব্যবহার করুন : ডকুমেন্টেশন অনুসারে

$ ইলেম ম্যাচ অপারেটর নথিগুলিতে মেলে যাতে কমপক্ষে একটি উপাদান সহ একটি অ্যারে ক্ষেত্র থাকে যা সমস্ত নির্দিষ্ট ক্যোয়ারী মানদণ্ডের সাথে মেলে।

$elemMatchesমানটি একটি অ্যারে এবং এটি খালি নয় তা নিশ্চিত করে। সুতরাং কোয়েরি কিছু হবে

ME.find({ pictures: { $elemMatch: {$exists: true }}})

পিএস এই কোডটির একটি রূপটি মঙ্গোডিবি বিশ্ববিদ্যালয়ের এম 121 কোর্সে পাওয়া যায়।


0

এছাড়াও আপনি সাহায্যকারী পদ্ধতি ব্যবহার করতে পারেন হইবে উপর মোঙ্গো অপারেটর $ বিদ্যমান

ME.find()
    .exists('pictures')
    .where('pictures').ne([])
    .sort('-created')
    .limit(10)
    .exec(function(err, results){
        ...
    });

0
{ $where: "this.pictures.length > 1" }

$ কোথায় এবং এটি.ফিল্ড_নাম.লেন্থটি পাস করুন যা অ্যারে ক্ষেত্রের আকার দেয় এবং সংখ্যার সাথে তুলনা করে এটি পরীক্ষা করে। অ্যারের আকারের চেয়ে যদি কোনও অ্যারের কোনও মান থাকে তবে এটি কমপক্ষে 1 হওয়া উচিত so সুতরাং সমস্ত অ্যারের ক্ষেত্রের দৈর্ঘ্য একের বেশি হওয়া উচিত, এর অর্থ এটির অ্যারে কিছু ডেটা রয়েছে


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