[mongodb] $ or 조건이있는 Mongoose의 찾기 방법이 제대로 작동하지 않습니다.

최근 Nodejs에서 Mongoose와 함께 MongoDB를 사용하기 시작했습니다.

$or조건 및 _id필드 와 함께 Model.find 메서드를 사용하면 Mongoose가 제대로 작동하지 않습니다.

작동하지 않습니다.

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

그건 그렇고, ‘_id’부분을 제거하면 작동합니다!

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

그리고 MongoDB 셸에서는 둘 다 제대로 작동합니다.



답변

인터넷 검색을 통해 해결했습니다.

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);
});


답변

나는 모든 사람들에게 Mongoose의 쿼리 작성기 언어와 콜백 대신 약속을 사용하기를 간청합니다.

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

몽구스 쿼리 에 대해 자세히 알아보십시오 .


답변

mongoDB 문서에 따르면 : “… 즉, MongoDB가 색인을 사용하여 $ or 표현식을 평가하려면 $ or 표현식의 모든 절이 색인에서 지원되어야합니다.”

따라서 다른 필드에 대한 색인을 추가하면 작동합니다. 나는 비슷한 문제가 있었고 이것이 해결되었습니다.

https://docs.mongodb.com/manual/reference/operator/query/or/에서 자세한 내용을 읽을 수 있습니다.


답변

async() => {
let body = await model.find().or([
  { name: 'something'},
  { nickname: 'somethang'}
]).exec();
console.log(body);
}
/* Gives an array of the searched query!
returns [] if not found */


답변