web-dev-qa-db-fra.com

Mongoose, Sélectionnez un champ spécifique avec find

J'essaie de sélectionner uniquement un champ spécifique avec

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

Mais dans ma réponse json je reçois aussi le _id, mon schéma de document n'a que deux champs, _id et name

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

Pourquoi???

90
TlonXP

Le champ _id est toujours présent, sauf si vous l'excluez explicitement. Faites-le en utilisant la syntaxe -:

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

Ou explicitement via un objet:

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

Il y a un moyen plus court de le faire maintenant:

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

Si vous voulez utiliser le plus de Schema fields et en omettre quelques-uns, vous pouvez préfixer le champ name d'un -. Par exemple, _ "-name" dans le deuxième argument non inclut le champ name dans le document alors que le L'exemple donné ici aura seulement le champ name dans les documents retournés.

59
Akash

Il existe un meilleur moyen de le gérer à l'aide du code Native MongoDB dans 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/

Remarque:

var usersProjection

La liste des objets listés ici ne sera pas retournée/imprimée.

19
ElvinD

Données DB

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

Requete

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

Sortie:

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

Exemple de terrain de travail

lien

7
Ratan Uday Kumar

La manière précise de le faire est d’utiliser la méthode de curseur .project() == avec la nouvelle mongodb et nodejs pilote.

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