Мангуст, Виберіть конкретне поле з знахідкою


121

Я намагаюся вибрати лише конкретне поле за допомогою

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 та ім'я

[{"_id":70672,"name":"SOME VALUE 1"},{"_id":71327,"name":"SOME VALUE 2"}]

Чому ???

Відповіді:


201

_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);
    });
};

1
Я думаю, що .selectце просто фільтр для вибору поля після того, як ви все це отримаєте, моя рекомендація - використовувати.find({}, 'name -_id')
hong4rc

3
@Hongarc, .find({}, 'name -_id')здається, не працює?
Шаніка Едірівеера

чи є спосіб отримати значення безпосередньо без obj на зразок ['value1', 'value2', 'value3'] замість ['name': 'value1', 'name': 'value2', 'name': 'value3']
М.Амер

66

Зараз існує коротший спосіб зробити це:

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 fieldsта хочете опустити лише декілька, ви можете префіксувати поле nameа -. Для колишнього "-name"в другому аргументі буде НЕ включати nameполе в документі , тоді як приклад , наведений тут буде тільки на nameполе в повернутої документації.


27
Для тих, хто хоче фільтрувати декілька полів, не розділяйте їх комою, просто простір:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
для тих, хто хоче скористатись пунктом вище dbSchema.Somevalue.find ({userEmail:'test@test.com '},' userEmail -_id ', функція (помилка, деякіValue)
користувач2180794

1
декілька полів будуть ['name', 'field2', 'field3', 'etc.'] замість просто 'name'
Eray T

24

Є кращий спосіб впоратися з цим за допомогою коду Native 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/

Примітка:

var користувачівProjection

Список об'єктів, перелічених тут, не повертається / друкується.


Як це зробити з FindOne?
zero_cool

опитувальник потребує масиву json. у вашого методу є інший ключ, ніж вони також прийдуть як вік тощо
Ратан Удай Кумар

Дивовижно, саме те, що я шукала
Тея

9

Дані БД

[
  {
    "_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"
  }
]

Робочий майданчик для зразків

посилання


4

Виключити

Нижче код отримає всі поля, крім пароля, у кожному документі:

const users = await UserModel.find({}, {
  password: 0 
});
console.log(users);

Вихідні дані

[
  {
    "_id": "5dd3fb12b40da214026e0658",
    "email": "example@example.com"
  }
]

Включати

Нижче коду буде завантажено лише поле електронної пошти у кожному документі:

const users = await UserModel.find({}, {
  email: 1
});
console.log(users);

Вихідні дані

[
  {
    "email": "example@example.com"
  }
]

3

Точний спосіб зробити це - використовувати .project()метод курсору з новим mongodbі nodejsдрайвером.

var query = await dbSchemas.SomeValue.find({}).project({ name: 1, _id: 0 })

3
.project()працює тільки з агрегатом. Якщо ви хочете використовувати його з find, використовуйте другий аргумент у find({},{ name: 1, _id: 0 })методі.
Шам

Ні, з новим драйвером вузла mongodb ви не повинні використовувати цей спосіб. Але з мангустом можна використовувати другий аргумент.
Аш

1
ах, це в драйвері nodejs.
Шам

Не розумію чому, але в нових версіях @Anthony має рацію ... Нижню версію ви можете зробити так ... дуже безладним
ackuser

2

Наприклад,

User.find({}, { createdAt: 0, updatedAt: 0, isActive: 0, _id : 1 }).then(...)

0 означає ігнорувати

1 означає шоу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.