Mongoose, выберите конкретное поле с помощью find

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"}]

Зачем???

TlonXP
источник

Ответы:

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')кажется не работает?
Shanika Ediriweera
есть ли способ получить значение напрямую без obj типа ['значение1', 'значение2', 'значение3'] вместо ['имя': 'значение1', 'имя': 'значение2', 'имя': 'value3']
М.Амер
67

Теперь есть более короткий способ сделать это:

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поле в возвращенной документации.

Акаша
источник
28
Для тех, кто хочет отфильтровать несколько полей, не разделяйте их запятыми, а просто пробелом:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave
1
для тех, кто хочет использовать предложение where в приведенном выше dbSchema.Somevalue.find ({userEmail:'test@test.com '},' userEmail -_id ', function (err, someValue)
user2180794
1
несколько полей будут ['name', 'field2', 'field3', 'etc'] вместо просто 'name'
Eray T
24

Есть лучший способ справиться с этим, используя собственный код 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 usersProjection

Список перечисленных здесь объектов не будет возвращен / распечатан.

ElvinD
источник
Как это сделать с помощью findOne?
zero_cool 06
Анкета необходима на имя json-массива. у вашего метода есть другой ключ, чем они также придут, как возраст, и т.д.
Ратан Удай Кумар
Потрясающе, именно то, что я искал
Teja
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 })
Ashh
источник
3
.project()работает только с агрегатом. Если вы хотите использовать его с поиском, используйте второй аргумент в find({},{ name: 1, _id: 0 })методе.
Sham
Нет, с новым драйвером узла mongodb вы должны использовать этот способ. Но с мангустом вы можете использовать второй аргумент.
Эш
1
ах, это в драйвере nodejs.
Sham
Не понимаю почему, но в новых версиях @Anthony прав ... Более низкие версии вы можете сделать это таким образом ... очень грязно
ackuser
2

Например,

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

0 означает игнорировать

1 означает шоу

Нишант Шах
источник