programing

Mongoose 컬렉션에서 특정 필드를 제외하려면 어떻게 해야 합니까?

css3 2023. 3. 1. 11:25

Mongoose 컬렉션에서 특정 필드를 제외하려면 어떻게 해야 합니까?

Mongoose ODM(Mongoose 3.3.1)을 사용하는 NodeJS 어플리케이션을 가지고 있습니다.컬렉션에서 1을 제외한 모든 필드를 가져오고 싶습니다.예:컬렉션 제품이 있습니다. 6개의 필드가 있습니다. "이미지" 필드를 제외한 모든 필드를 선택합니다. "제외" 메서드를 사용했지만 오류가 발생했습니다.이게 내 암호였어

    var Query = models.Product.find();
    Query.exclude('title Image');

    if (req.params.id) {
        Query.where('_id', req.params.id);
    }


    Query.exec(function (err, product) {
        if (!err) {
            return res.send({ 'statusCode': 200, 'statusText': 'OK', 'data': product });
        } else {
            return res.send(500);
        }
    });

그러나 이것은 오류를 반환한다.

Express
500 TypeError: Object #<Query> has no method 'exclude'.........

나도 노력했어var Query = models.Product.find().exclude('title','Image');그리고.var Query = models.Product.find({}).exclude('title','Image');하지만 같은 오류가 발생합니다.Mongoose 컬렉션에서 특정 필드를 하나(2) 제외하는 방법.

현재(3.x) Mongoose 빌드에서 필드 선택에 사용합니다.

제외할 필드 이름 앞에 다음 이름을 붙입니다.-; 고객님의 경우:

Query.select('-Image');

Quick aside: JavaScript에서는 대문자로 시작하는 변수는 컨스트럭터 함수용으로 예약해야 합니다.그래서 이름을 바꾸는 것을 고려해보세요.Query~하듯이query당신의 코드로.

그 .exclude 함수에 대해 어디서 읽는지 모르겠습니다.왜냐하면 어떤 문서에서도 찾을 수 없기 때문입니다.

그러나 찾기 메서드의 두 번째 매개 변수를 사용하여 필드를 제외할 수 있습니다.

공식 문서의 를 다음에 나타냅니다.

db.inventory.find( { type: 'food' }, { type:0 } )

이 작업은 유형 필드의 값이 음식인 모든 문서를 반환하지만 출력에 유형 필드를 포함하지 않습니다.

Model.findOne({ _id: Your Id}, { password: 0, name: 0 }, function(err, user){
  // put your code
});

이 코드가 제 프로젝트에서 작동했어요감사합니다!!좋은 하루 되세요.

넌 할 수 있어

const products = await Product.find().select(['-image'])

비동기 wait와 함께 사용하고 있습니다.

async (req, res) => {
      try { 
        await User.findById(req.user,'name email',(err, user) => {
          if(err || !user){
            return res.status(404)
          } else {
            return res.status(200).json({
              user,
            });
          }
        });
      } catch (error) {
        console.log(error);
      }

Mongoose 업데이트 버전에서는 다음과 같이 사용하여 선택한 필드를 얻을 수 있습니다.

user.findById({_id: req.body.id}, 'username phno address').then(response => {
  res.status(200).json({
    result: true,
    details: response
  });
}).catch(err => {
  res.status(500).json({ result: false });
});

나는 특집을 만들고 있다.프로젝트를 수집할 사용자 이름보다 userId 배열 이름 "collectedUser"를 저장합니다.또한 "collected Users" 대신 "isCollected" 필드를 반환하고 싶습니다.그래서 선택은 내가 원하는 것이 아니다.하지만 해결 방법이 있어요

데이터베이스에서 프로젝트를 가져온 후 "isCollected"를 추가합니다.

for (const item of projects) {
    item.set("isCollected", item.collectedUsers.includes(userId), {
        strict: false,
    })
}

그리고 이것은 데코레이터 @Schema에 있습니다.

@Schema({
timestamps: true,
toObject: {
    virtuals: true,
    versionKey: false,
    transform: (doc, ret, options): Partial<Project> => {
        return {
            ...ret,
            projectManagers: undefined,
            projectMembers: undefined,
            collectedUsers: undefined
        }
    }
}
})

드디어 컨트롤러에 탑재

projects = projects.map(i => i.toObject())

정의되지 않은 묘한 속임수지만, 정말 효과가 있습니다.

근데 난 nestjs를 쓰고 있어.

이렇게 하면 돼

const products = await Product.find().select({
  "image": 0
});

쿼리 필드(예: 비밀번호 필드)에서 필드를 생략하는 방법보다 글로벌 옵션과 유사한 방법을 찾는 모든 사용자에게 정의되지 않은 상태로 반환되는 getter를 사용하는 것도 도움이 됩니다.

{
    password: {
      type: String,
      required: true,
      get: () => undefined,
    },
}

NB: 옵션에서 Getters를 활성화해야 합니다.{ toObject: { getters:true } }

속성을 추가하여 스키마 정의에서 필드를 제외할 수 있습니다.

    excludedField : {
...
    select: false,
...
    }

결과에 추가할 때마다 find()에 추가합니다.

find().select('+excludedFiled')

언급URL : https://stackoverflow.com/questions/14559200/how-to-exclude-one-particular-field-from-a-collection-in-mongoose