it-swarm.it

Il metodo di ricerca di Mongoose con $ o condizione non funziona correttamente

Recentemente ho iniziato a utilizzare MongoDB con Mongoose su Nodejs. 

Quando utilizzo il metodo Model.find con la condizione $or condition e il campo _id, Mongoose non funziona correttamente.

Questo non funziona:

User.find({
  $or: [
    { '_id': param },
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});

A proposito, se rimuovo la parte '_id', questo funziona!

User.find({
  $or: [
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});

E in MongoDB Shell, entrambi funzionano correttamente.

77
Younghan

L'ho risolto tramite google:

var ObjectId = require('mongoose').Types.ObjectId;
var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
// You should make string 'param' as ObjectId type. To avoid exception, 
// the 'param' must consist of more than 12 characters.

User.find( { $or:[ {'_id':objId}, {'name':param}, {'nickname':param} ]}, 
  function(err,docs){
    if(!err) res.send(docs);
});
155
Younghan

Imploro tutti a usare il linguaggio del generatore di query di Mongoose e promette invece di richiamare:

User.find().or([{ name: param }, { nickname: param }])
    .then(users => { /*logic here*/ })
    .catch(error => { /*error logic here*/ })

Maggiori informazioni su Query Mongoose .

16
Govind Rai

Secondo la documentazione di mongoDB: "... Cioè, per MongoDB usare gli indici per valutare $ o un'espressione, tutte le clausole in $ o espressione devono essere supportate dagli indici." 

Quindi aggiungi indici per i tuoi altri campi e funzionerà. Ho avuto un problema simile e questo lo ha risolto.

Puoi leggere di più qui: https://docs.mongodb.com/manual/reference/operator/query/or/

0
Farasi78