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é???

TlonXP
fuente

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);
    });
};
Neil Lunn
fuente
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.

Akash
fuente
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:'[email protected] '},' 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á.

ElvinD
fuente
¿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

Ratan Uday Kumar
fuente
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": "[email protected]"
  }
]

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": "[email protected]"
  }
]
Zeeshan Ahmad
fuente
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 })
Ashh
fuente
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

Nishant Shah
fuente