Использование метода .select() Mongoose
Я довольно запутался в использовании метода select
. Вот как я его использую, и это неправильно:
Transaction.find({username : user.username}).select('uniqueId', 'confirmation_link', 'item_name', 'timeout', 'username', function(err, txs){
callback(txs);
});
То, что я пытаюсь достичь, - это просто выбрать из транзакций в базе данных те, у которых есть это имя пользователя, и я хочу извлечь только поля, перечисленные в методе select
. Может ли кто-нибудь указать, как использовать метод select
? Спасибо.
Ответы
Ответ 1
docs говорят, что вы можете добиться этого так:
Mongoose v4.0
// Retrieving only certain fields
Model.find({}, 'first last', function (err, docs) {
});
старый устаревший API
// Retrieving only certain fields
Model.find({}, ['first', 'last'], function (err, docs) {
// docs is an array of partially-`init`d documents
// defaults are still applied and will be "populated"
});
чтобы вы могли сделать это без select()
.
Ответ 2
Теперь есть более короткий способ сделать это (не используя .select
и не используя массив), просто передавая поля, разделенные пробелами, как второй аргумент
User.find({}, 'first last', function (err, usr) {
//Got the result, saved a few bytes of code
});
Документы
Ответ 3
это еще один способ: запросы в мангусте
Transaction.find({username : user.username})
.select('uniqueId confirmation_link item_name timeout username')
.exec(function(err, txs) {
console.log(txs);
});
Ответ 4
Чтобы получить определенные поля без получения "_id", вы можете указать, чтобы исключить его
Model.find({}, {'Username':1, '_id':0}, function ( err, docs ){}.....
Ответ 5
Это было очень полезно: Как защитить поле пароля в Mongoose/MongoDB, чтобы он не возвращался в запрос при заполнении коллекций?
Похоже, у вас есть несколько вариантов.
1) Используйте select('-_id')
.
2) Используйте find({whatever: values}, '-_id', callback...}
. Я не могу проверить этот метод, но если он работает с select()
, я не понимаю, почему он здесь не работает.
Ответ 6
Чтобы получить только определенные поля, используйте следующее,
Model.find({/*Your query*/},
{'firstName':1, 'lastname':1, '_id':0}, //Notice, this will omit _id!
function ( err, docs ){}.....
который будет работать и не будет вводить лишний идентификатор, такой как _id.
Ответ 7
операция выбора и проецирования может быть выполнена таким образом легко в nodejs. Попробуйте это
var Selection={
<some key of data model > : <target value for that key field>,
<some key of data model > : <target value for that key field>
//you can add many parameters here selection operation
};
var Projection = {
__v : false,
_id : false
//you can add many parameters here for projection
};
<DataModel>.find(Selection,Projection,function (err,data) {
if(err){
console.log(err);
}else{
console.log(data);
}
});
Ответ 8
Удалите запятые и кавычки между полями, которые вы хотите выбрать:
Transaction.find({username : user.username}).select('uniqueId confirmation_link item_name timeout username', function(err, txs){
callback(txs);
});