it-swarm.com.de

Wie kann man MongoDB abfragen, um zu testen, ob ein Artikel vorhanden ist?

Bietet MongoDB eine Such- oder Abfragemethode zum Testen, ob ein Element basierend auf einem Feldwert vorhanden ist? Wir möchten nur prüfen, ob der Artikel vollständig ist.

29
user646584

Ich glaube nicht, dass es einen direkten Weg gibt, die Existenz des Artikels anhand seines Wertes zu überprüfen. Sie können dies jedoch tun, indem Sie nur die ID ( mit Feldauswahl ) abrufen.

db.your_collection.find({..criteria..}, {"_id" : 1});
22
RameshVel

Da Sie die Zählung nicht benötigen, sollten Sie sicherstellen, dass die Abfrage zurückgegeben wird, nachdem die erste Übereinstimmung gefunden wurde. Da count Leistung nicht ideal ist , ist das eher wichtig. Die folgende Abfrage sollte das erreichen:

db.Collection.find({ /* criteria */}).limit(1).size();

Beachten Sie, dass find().count() standardmäßig not die limit-Klausel nicht beachtet und daher unerwartete Ergebnisse zurückgeben kann (und versucht, alle Übereinstimmungen zu finden). size() oder count(true) werden das Limit-Flag einhalten.

Wenn Sie ins Extreme gehen wollen, sollten Sie sicherstellen, dass Ihre Abfrage verdeckte Indizes verwendet. Abgedeckte Indizes greifen nur auf den Index zu. Sie erfordern jedoch, dass das Feld, für das Sie eine Abfrage durchführen, indiziert ist. Im Allgemeinen sollte dies der Fall sein, da eine count() offensichtlich keine Felder zurückgibt. Verdeckte Indizes benötigen jedoch manchmal recht ausführliche Cursor:

db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();

{
  // ...
  "cursor" : "BtreeCursor value_1",
  "indexOnly" : true,  // covered!
}

Leider bietet count()explain() nicht an, also ist es schwer zu sagen, ob es das wert ist oder nicht. Wie üblich ist die Messung ein besserer Begleiter als die Theorie, aber die Theorie kann Sie zumindest vor den größeren Problemen bewahren.

49
mnemosyn

Die Verwendung von find () + limit () ist erheblich schneller, da findOne () das Dokument immer liest und zurückgibt, wenn es vorhanden ist. find () gibt nur einen Cursor zurück (oder nicht) und liest die Daten nur, wenn Sie den Cursor durchlaufen.

db.collection.find({_id: "myId"}, {_id: 1}).limit(1)

(anstelle von db.collection.findOne({_id: "myId"}, {_id: 1})).

Schauen Sie sich weitere Details an: Überprüfen, ob ein Dokument vorhanden ist - MongoDB slow findOne vs find

14
gihanchanuka

Starten von Mongo 2.6, count hat einen optionalen limit-Parameter, der es eine nützliche Alternative darstellt, um herauszufinden, ob ein Dokument existiert oder nicht:

db.collection.count({}, { limit: 1 })
// returns 1 if exists and 0 otherwise

oder mit einer Filteranfrage:

db.collection.count({/* criteria */}, { limit: 1 })

Durch die Begrenzung der Anzahl übereinstimmender Vorkommen wird der Sammlungsscan angehalten, wenn eine Übereinstimmung gefunden wird, anstatt die gesamte Sammlung durchzusehen.


Starten von Mongo 4.0.3, da count()als veraltet gilt wir können stattdessen countDocuments verwenden:

db.collection.countDocuments({}, { limit: 1 })

oder mit einer Filteranfrage:

db.collection.countDocuments({/* criteria */}, { limit: 1 })
5
Xavier Guihot

Ich habe einfach lodash Framework verwendet - _isEmpty ();

const {MongoClient, ObjectId} = requir ('mongodb'); const _ = required ('lodash');

MongoClient.connect (testURL, {useNewUrlParser: true}, (err, client) => { Let db = client.db ('meinefirma');

if (err) {
console.log('unable to connect to the mycompany database');
} else {
console.log('test connection to the database');
};

db.collection('employee').find({name:    'Test User'}).toArray((err, result) => {

    if (err) {
        console.log('The search errored');
    } else if (_.isEmpty(result)) {
        console.log('record not found')
    } else {
        console.log(result);
    };
});

client.close ();

});

0
ufookoro