جاوااسکریپت - Mongoose، انتخاب یک فیلد خاص با استفاده از find
من سعی دارم فقط یک فیلد خاص را انتخاب کنم
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 و name
[{"_id":70672,"name":"SOME VALUE 1"},{"_id":71327,"name":"SOME VALUE 2"}]
چرا؟؟؟
پاسخ شماره ۱
فیلد _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);
});
};
پاسخ شماره ۲
اکنون یک روش کوتاهتر برای انجام این کار وجود دارد:
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 را داشته باشید و فقط چند فیلد را نادیده بگیرید، میتوانید پیش از نام فیلد name یک - (علامت منفی) قرار دهید. برای مثال "-name" در آرگومان دوم فیلد name را در سند شامل نخواهد کرد، در حالی که مثالی که در اینجا آمده است، تنها فیلد name را در اسناد بازگردانده شده خواهد داشت.
پاسخ شماره ۳
راه بهتری برای مدیریت آن با استفاده از کد بومی MongoDB در Mongoose وجود دارد.
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/
توجه :
متغیر usersProjection
لیست اشیایی که در اینجا فهرست شدهاند بازگردانده/چاپ نخواهند شد.
پاسخ شماره ۴
نکته: ۰ به معنی نادیده گرفتن و ۱ به معنی نمایش است.
مثال 1:
User.find({}, { createdAt: 0, updatedAt: 0, isActive: 0, _id : 1 }).then(...)
مثال ۲:
User.findById(id).select("_id, isActive").then(...)
مثال ۳:
User.findById(id).select({ _id: 1, isActive: 1, name: 1, createdAt: 0 }).then(...)
پاسخ شماره ۵
دادههای پایگاهداده
[
{
"_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"
}
]
محل بازی نمونه کاری
پیوند
پاسخ شماره ۶
مستثنی کردن
کد زیر تمام فیلدها به جز کلمه عبور را در هر سند بازیابی خواهد کرد:
const users = await UserModel.find({}, {
password: 0
});
console.log(users);
خروجی
[
{
"_id": "5dd3fb12b40da214026e0658",
"email": "[email "
}
]
شامل کردن
کد زیر فقط فیلد ایمیل را در هر سند بازیابی خواهد کرد:
const users = await UserModel.find({}, {
email: 1
});
console.log(users);
خروجی
[
{
"email": "[email "
}
]
