Mangosta, seleccione un campo específico con buscar


121

Estoy intentando seleccionar solo un campo específico con

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

Pero en mi respuesta json también recibo el _id, el esquema de mi documento solo tiene dos campos, _id y name

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

¿¿¿Por qué???

Respuestas:


200

El _idcampo siempre está presente a menos que lo excluya explícitamente. Hágalo usando la -sintaxis:

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

O explícitamente a través de un objeto:

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
Creo que .selectsolo es un filtro para elegir el campo después de obtener todo eso, mi recomendación es usar.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')parece no funcionar?
Shanika Ediriweera

¿Hay alguna manera de obtener el valor directamente sin un obj como ['valor1', 'valor2', 'valor3'] en lugar de ['nombre': 'valor1', 'nombre': 'valor2', 'nombre': 'value3']
M.Amer

66

Hay una forma más corta de hacer esto ahora:

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

En caso de que desee la mayoría de los Schema fieldsy desee omitir solo algunos, puede prefijar el campo namecon un -. Por ejemplo, "-name"en el segundo argumento no se incluirá el namecampo en el documento, mientras que el ejemplo que se da aquí solo tendrá el namecampo en los documentos devueltos.


27
Para aquellos que quieran filtrar varios campos, no los separe con comas, solo espacio en blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
blanco

1
para aquellos que quieran usar la cláusula where en la anterior dbSchema.Somevalue.find ({userEmail:'test@test.com '},' userEmail -_id ', function (err, someValue)
user2180794

1
varios campos serían ['nombre', 'campo2', 'campo3', 'etc'] en lugar de solo 'nombre'
Eray T

24

Hay una mejor manera de manejarlo usando el código nativo de MongoDB en 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/

Nota:

var usersProjection

La lista de objetos enumerados aquí no se devolverá / imprimirá.


¿Cómo haces esto con findOne?
zero_cool

El cuestionario necesita el nombre de la matriz json. con su método de otra tecla que no son ellos también vendrán como la edad, etc
Ratan Uday Kumar

Impresionante, justo lo que estaba buscando
Teja

9

Datos DB

[
  {
    "_id": "70001",
    "name": "peter"
  },
  {
    "_id": "70002",
    "name": "john"
  },
  {
    "_id": "70003",
    "name": "joseph"
  }
]

Consulta

db.collection.find({},
{
  "_id": 0,
  "name": 1
}).exec((Result)=>{
    console.log(Result);
})

Salida:

[
  {
    "name": "peter"
  },
  {
    "name": "john"
  },
  {
    "name": "joseph"
  }
]

Zona de juegos de muestra de trabajo

enlace


4

Excluir

El siguiente código recuperará todos los campos que no sean la contraseña dentro de cada documento:

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

Salida

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

Incluir

El siguiente código solo recuperará el campo de correo electrónico dentro de cada documento:

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

Salida

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

3

La forma precisa de hacer esto es usar el .project()método del cursor con el nuevo controlador mongodby nodejs.

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

3
.project()funciona solo con agregado. Si desea usarlo con buscar, use el segundo argumento en el find({},{ name: 1, _id: 0 })método.
Sham

No, con el nuevo controlador de nodo mongodb, debe usarlo de esta manera. Pero con mangosta puedes usar un segundo argumento.
Ashh

1
ah, está en el controlador de nodejs.
Sham

No entiendo por qué, pero en las nuevas versiones @Anthony tiene razón ... Las versiones inferiores pueden hacerlo de esta manera ... muy complicado
ackuser

2

Por ejemplo,

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

0 significa ignorar

1 significa mostrar

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.