몽구스, 찾기로 특정 필드 선택


121

특정 필드 만 선택하려고합니다.

exports.someValue = function(req, res, next) {
    //query with mongoose
    var query = dbSchemas.SomeValue.find({}).select('name');

    query.exec(function (err, someValue) {
        if (err) return next(err);
        res.send(someValue);
    });
};

하지만 내 json 응답에서 _id도 받고 있는데, 내 문서 스키마에는 _id와 이름이라는 두 개의 파일 만 있습니다.

[{"_id":70672,"name":"SOME VALUE 1"},{"_id":71327,"name":"SOME VALUE 2"}]

왜???

답변:


201

_id당신이 명시 적으로 제외하지 않는 필드는 항상 존재합니다. 다음 -구문을 사용하여 수행하십시오 .

exports.someValue = function(req, res, next) {
    //query with mongoose
    var query = dbSchemas.SomeValue.find({}).select('name -_id');

    query.exec(function (err, someValue) {
        if (err) return next(err);
        res.send(someValue);
    });
};

또는 객체를 통해 명시 적으로 :

exports.someValue = function(req, res, next) {
    //query with mongoose
    var query = dbSchemas.SomeValue.find({}).select({ "name": 1, "_id": 0});

    query.exec(function (err, someValue) {
        if (err) return next(err);
        res.send(someValue);
    });
};

1
내가 생각하는 .select당신이이 모든 것을 얻을 후 필드를 선택하는 필터입니다, 내 추천은 사용하는 것입니다.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')가 작동하지 않는 것 같습니까?
Shanika Ediriweera

[ 'name': 'value1', 'name': 'value2', 'name'대신 [ 'value1', 'value2', 'value3']과 같은 obj없이 값을 직접 가져 오는 방법이 있습니까? 'value3']
M.Amer

66

이제 더 짧은 방법이 있습니다.

exports.someValue = function(req, res, next) {
    //query with mongoose
    dbSchemas.SomeValue.find({}, 'name', function(err, someValue){
      if(err) return next(err);
      res.send(someValue);
    });
    //this eliminates the .select() and .exec() methods
};

경우 당신이 대부분을 원 Schema fields하고 몇 생략 할 경우 해당 필드 앞에 수 name로모그래퍼 -. 예 "-name"를 들어 두 번째 인수의 경우 문서에 필드가 포함 되지 않지만name 여기에 제공된 예제 에는 반환 된 문서 의 필드 name 있습니다.


27
여러 필드를 필터링하려는 경우 쉼표로 구분하지 말고 일반 공백 만 사용하십시오.blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
dbSchema.Somevalue.find ({userEmail : 'test@test.com '},'userEmail -_id ', function (err, someValue)
user2180794

1
여러 필드는 'name'대신 [ 'name', 'field2', 'field3', 'etc']가됩니다.
Eray T

24

Mongoose의 Native MongoDB 코드를 사용하여 더 나은 방법이 있습니다.

exports.getUsers = function(req, res, next) {

    var usersProjection = { 
        __v: false,
        _id: false
    };

    User.find({}, usersProjection, function (err, users) {
        if (err) return next(err);
        res.json(users);
    });    
}

http://docs.mongodb.org/manual/reference/method/db.collection.find/

노트 :

var usersProjection

여기에 나열된 개체 목록은 반환 / 인쇄되지 않습니다.


findOne으로이 작업을 어떻게 수행합니까?
zero_cool

질문지는 이름 json 배열에 필요합니다. 당신의 방법으로 다른 키는 또한 등 시대처럼 올 것이다보다가
라탄 우다이 쿠마르

굉장, 그냥 내가 무엇을 찾고 있었다
테이야

9

DB 데이터

[
  {
    "_id": "70001",
    "name": "peter"
  },
  {
    "_id": "70002",
    "name": "john"
  },
  {
    "_id": "70003",
    "name": "joseph"
  }
]

질문

db.collection.find({},
{
  "_id": 0,
  "name": 1
}).exec((Result)=>{
    console.log(Result);
})

산출:

[
  {
    "name": "peter"
  },
  {
    "name": "john"
  },
  {
    "name": "joseph"
  }
]

작업 샘플 놀이터

링크


4

들어오지 못하게 하다

아래 코드는 각 문서 내에서 비밀번호를 제외한 모든 필드를 검색합니다.

const users = await UserModel.find({}, {
  password: 0 
});
console.log(users);

산출

[
  {
    "_id": "5dd3fb12b40da214026e0658",
    "email": "example@example.com"
  }
]

포함

아래 코드는 각 문서 내의 이메일 필드 만 검색합니다.

const users = await UserModel.find({}, {
  email: 1
});
console.log(users);

산출

[
  {
    "email": "example@example.com"
  }
]

3

이를 수행하는 정확한 방법 .project()은 new mongodbnodejsdriver 에서 커서 방법 을 사용 하는 것입니다 .

var query = await dbSchemas.SomeValue.find({}).project({ name: 1, _id: 0 })

3
.project()집계에서만 작동합니다. find와 함께 사용하려면 find({},{ name: 1, _id: 0 })메소드 에서 두 번째 인수를 사용하십시오.
Sham

새로운 mongodb 노드 드라이버에서는이 방법을 사용해야합니다. 그러나 몽구스에서는 두 번째 인수를 사용할 수 있습니다.
Ashh

1
아, 그것은 nodejs 드라이버에 있습니다.
Sham

이유를 이해하지만, 새 버전에 @Anthony를 잘 작성하지 마십시오 ... 낮은 버전을 당신은 ... 그것을 아주 혼란이 방법을 수행 할 수 있습니다
ackuser

2

예를 들면

User.find({}, { createdAt: 0, updatedAt: 0, isActive: 0, _id : 1 }).then(...)

0은 무시를 의미합니다.

1은 표시를 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.