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


116

최근 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 셸에서는 둘 다 제대로 작동합니다.

답변:


211

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

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

2
이 솔루션이 단어로 작동하는 이유를 설명 할 수 있습니까? 감사합니다
Alexander Mills

이것은 다소 구체적인 문제에 대한 해결책처럼 보입니다. 계속 검색해야 할 수도 있습니다.
Kesarion 2016-04-15

참고 자료를 제공해 주시겠습니까? 이 경우 param이 12 자 이상으로 구성되어야하는 이유는 무엇입니까? 이것이 귀하의 문제 또는 ObjectId ()의 요구 사항에 특정한 것입니까? 내 매개 변수에 12자가 없으면 어떻게합니까? 감사!
유성구

6
다음과 같이 ObjectId를 확인할 수도 있습니다.const mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid(objectidtocheck)
Orhan

@yusong 그것은 mongoose 때문입니다 유효한 ObjectId가 아닌 경우 오류가 발생합니다. 그것을 수행하는 더 깨끗한 방법은 위에서 언급했습니다.
Haydar Ali Ismail은

53

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

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

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


그것을 사랑하십시오! 알림 주셔서 감사합니다!
zeckdude

0

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

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

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


1
이것은 잘못된 문장입니다. 인덱스를 사용해야하는 경우에만 인덱스가 필요합니다. 즉, 성능, 컬렉션 스캔을 피하기 위해. 그러나 성능이 문제가 아니라면 (예 : 컬렉션이 매우 작음) 문제가되지 않습니다.
Andy Lorenz

0
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 */

1
귀하의 답변은 Govind Rai의 답변과 어떻게 다른가요? 당신의 것이 그들의 것보다 우월한 이유는 무엇입니까?
BDL

async / await, 아무것도 우월하지 않습니까?
Firez

2
이 사이트에서 코드 전용 답변은 일반적으로 눈살을 찌푸립니다. 코드에 대한 설명이나 설명을 포함하도록 답변을 편집 해 주시겠습니까? 설명은 다음과 같은 질문에 답해야합니다. 어떻게하나요? 어디로 갑니까? OP의 문제를 어떻게 해결합니까? 참조 : anwser 방법 . 감사!
Eduardo Baitello
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.