programing

mongoose를 사용하여 컬렉션에 ID가 있는지 확인합니다.

testmans 2023. 5. 5. 08:45
반응형

mongoose를 사용하여 컬렉션에 ID가 있는지 확인합니다.

예를 들어, 나는 수집품을 가지고 있습니다.User:

var mongoose = require('mongoose');

var UserSchema = new mongoose.Schema({
    email: String,
    googleId: String,
    facebookId: String,
    displayName: String,
    active: Boolean
});

module.exports = mongoose.model('User', UserSchema);

그리고 나는 아이디가 있습니다.

var userID = "some-user-id"

이 ID가 존재하는지 확인하는 올바른 방법은 무엇입니까?User수집.파일을 읽거나 반환하는 데 필요한 것은 아닙니다. 단지 그것이 필요합니다.true또는false가치.

이를 달성하기 위한 한 가지 방법은 다음과 같습니다.

User.findOne({
     _id: userID
}, function (err, existingUser) {

하지만 더 빠르고 효율적인 방법이 있을까요?

사용하다count하나를 찾는 것보다.

이렇게 하면 (후드 아래) 몽구스가 사용됩니다.find: http://docs.mongodb.org/manual/reference/method/db.collection.count

findOne()문서가 존재하는 경우 문서를 읽습니다 + 반환합니다.find()커서만 반환하고(또는 그렇지 않음) 커서 위에서 반복하는 경우에만 데이터를 읽습니다.그래서 우리의 경우, 우리는 커서를 두고 반복하는 것이 아니라 단지 반환된 결과를 세는 것입니다.

User.countDocuments({_id: userID}, function (err, count){ 
    if(count>0){
        //document exists });
    }
}); 

2019년 9월 기준으로 다음과 같이 사용할 수 있습니다.

const doesUserExit = await User.exists({ _id: userID });

문서에서:

후드 아래에,MyModel.exists({ answer: 42 })와 동등합니다.MyModel.findOne({ answer: 42 }).select({ _id: 1 }).lean().then(doc => !!doc)

적은 양의 컬렉션에 대해서는 허용된 답변이 좋습니다.

대규모 컬렉션에서 더 빠른 방법은 다음과 같은 것을 사용하는 것입니다.

const result = await User.findOne({ _id: userID }).select("_id").lean();
if (result) {
    // user exists...
}

// or without "async/await":

User.findOne({ _id: userID }).select("_id").lean().then(result => {
    if (result) {
        // user exists...
    }
});

모든 필드를 반환하지는 않습니다.저는 그들이 현재 당신과 제가 원하는 것을 지원하기 위해 새로운 기능을 개발하고 있다고 생각합니다.


그 동안 매우 간단하고 재사용 가능한 플러그인을 만들 수 있었습니다.

다음을 작성합니다.any.js다음 코드를 가진 파일:

module.exports = function any(schema, options) {
    schema.statics.any = async function (query) {
        const result = await this.findOne(query).select("_id").lean();
        return result ? true : false;
      };
  }

그런 다음 모델에서 다음 작업을 수행합니다.

var mongoose = require('mongoose');
const any = require('./plugins/any'); // I'm assuming you created a "plugins" folder for it

var UserSchema = new mongoose.Schema({
    email: String,
    googleId: String,
    facebookId: String,
    displayName: String,
    active: Boolean
});

UserSchema.plugin(any);
module.exports = mongoose.model('User', UserSchema);

...그리고 다음과 같이 사용합니다.

const result = await User.any({ _id: userID });
if (result) {
    // user exists...
}

// or without using "async/await":

User.any({ _id: userID }).then(result => {
    if (result) {
        // user exists...
    }
});

또는 비동기/대기 없이 기존 함수를 사용할 수 있습니다.

myData = {_id: userID};

User.exists(myData,(error, result)=>{
    if (error){
      console.log(error)
    } else {
      console.log("result:", result)  //result is true if myData already exists
    }
  });

이제 결과를 가지고 놀 수 있습니다!

User.exists({ _id: userID }).then(exists => {
  if (exists) {
    res.redirect('/dashboard')
  } else {
    res.redirect('/login')
  }
})

Mongoose 문서에서 더 많은 정보를 찾을 수 있습니다.

허용된 답변은 훌륭하지만 색인화된 속성(예: X의 _id)으로 기존 문서를 검색하는 경우에는 추정된 DocumentCount()를 사용하는 것이 좋습니다.

반면에, 이것은 실제로 더 잘 작동해야 하고 더 깨끗해야 합니다.

언급URL : https://stackoverflow.com/questions/27482806/check-if-id-exists-in-a-collection-with-mongoose

반응형