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
'programing' 카테고리의 다른 글
<%, <%@, <%=, <%#... 무슨 일입니까? (0) | 2023.05.05 |
---|---|
Bash 어레이에 값이 포함되어 있는지 확인합니다. (0) | 2023.05.05 |
복제할 수 없는 이유는 무엇입니까? (0) | 2023.05.05 |
WPF textBox에 새 줄을 추가하지 않음을 입력합니다. (0) | 2023.05.05 |
크기 조정 후 확장기의 내용에 맞게 WPF 창의 크기를 유지하는 방법 (0) | 2023.05.05 |