ti-enxame.com

Como consultar o MongoDB para testar se um item existe?

O MongoDB oferece um método de pesquisa ou consulta para testar se um item existe com base em qualquer valor de campo? Nós apenas queremos verificar a existência, não retornar o conteúdo completo do item.

29
user646584

Eu não acredito que haja uma maneira direta de verificar a existência do item pelo seu valor. Mas você poderia fazer isso apenas recuperando apenas id ( com seleção de campo )

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

Como você não precisa da contagem, verifique se a consulta retornará após encontrar a primeira correspondência. Desde o desempenho da contagem não é o ideal , isso é bastante importante. A consulta a seguir deve realizar isso:

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

Observe que find().count() por padrão não não honra a cláusula limit e pode, portanto, retornar resultados inesperados (e tentará encontrar todas as correspondências). size() ou count(true) homenageará o sinalizador de limite.

Se você quiser ir a extremos, você deve se certificar de que sua consulta usa índices cobertos . Índices cobertos acessam apenas o índice, mas exigem que o campo que você consulta seja indexado. Em geral, isso deve ser feito porque uma count() obviamente não retorna nenhum campo. Ainda assim, os índices cobertos às vezes precisam de cursores bem detalhados:

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

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

Infelizmente, count() não oferece explain(), portanto, vale a pena ou não, é difícil dizer. Como de costume, a medição é um melhor companheiro que a teoria, mas a teoria pode pelo menos salvá-lo dos problemas maiores.

49
mnemosyn

É significativamente mais rápido usar find () + limit () porque findOne () Sempre lerá + retornará o documento se ele existir. find () apenas retorna um cursor (ou não) e somente lê os dados se você iterar através do cursor.

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

(em vez de db.collection.findOne({_id: "myId"}, {_id: 1})).

Veja mais detalhes: Verificando se existe um documento - MongoDB slow findOne vs find

12
gihanchanuka

Iniciando Mongo 2.6, count tem um parâmetro opcional limit, o que torna uma alternativa viável descobrir se um documento existe ou não:

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

ou com uma consulta de filtragem:

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

Limitar o número de ocorrências correspondentes faz com que a verificação de coleção pare sempre que uma correspondência é encontrada, em vez de passar por toda a coleção.


Iniciando Mongo 4.0.3, uma vez que count() é considerado depreciado podemos usar countDocuments em vez disso:

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

ou com uma consulta de filtragem:

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

Eu simplesmente usei o framework lodash - _isEmpty ();

const {MongoClient, ObjectId} = exigir ('mongodb'); const _ = require ('lodash');

MongoClient.connect (testURL, {useNewUrlParser: true}, (err, cliente) => { Deixe db = client.db ('minhaempresa');

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