최근 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 */