Mangouste, sélectionnez un champ spécifique avec rechercher

121

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 également le _id, mon schéma de document n'a que deux fiels, _id et name

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

Pourquoi???

TlonXP
la source

Réponses:

201

Le _idchamp 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);
    });
};
Neil Lunn
la source
1
Je pense .selectque c'est juste un filtre pour choisir le champ après avoir obtenu tout cela, ma recommandation est d'utiliser.find({}, 'name -_id')
hong4rc
3
@Hongarc .find({}, 'name -_id')semble ne pas fonctionner?
Shanika Ediriweera
existe-t-il un moyen d'obtenir la valeur directement sans un objet comme ['valeur1', 'valeur2', 'valeur3'] au lieu de ['nom': 'valeur1', 'nom': 'valeur2', 'nom': 'value3']
M.Amer
66

Il existe un moyen plus court de faire cela 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 la plupart des Schema fieldset n'en omettez que quelques-uns, vous pouvez préfixer le champ nameavec un -. Par exemple, "-name"le deuxième argument n'inclura pas dename champ dans le document alors que l'exemple donné ici n'aura que le namechamp dans les documents retournés.

Akash
la source
27
Pour ceux qui veulent filtrer plusieurs champs, ne les séparez pas par une virgule, juste un espace simple:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave
1
pour ceux qui veulent utiliser la clause where dans dbSchema.Somevalue.find
user2180794
1
plusieurs champs seraient ['name', 'field2', 'field3', 'etc'] au lieu de simplement 'name'
Eray T
24

Il existe un meilleur moyen de le gérer en utilisant le code MongoDB natif 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.

ElvinD
la source
Comment faites-vous cela avec findOne?
zero_cool
les besoins du questionnaire sur le nom du tableau json. avec votre méthode, d'autres clés sont là qu'elles viendront aussi comme l'âge, etc.
Ratan Uday Kumar
Génial, exactement ce que je cherchais
Teja
9

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

Production:

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

Terrain de jeu d'échantillons de travail

lien

Ratan Uday Kumar
la source
4

Exclure

Le code ci-dessous récupérera tous les champs autres que le mot de passe dans chaque document:

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

Production

[
  {
    "_id": "5dd3fb12b40da214026e0658",
    "email": "[email protected]"
  }
]

Comprendre

Le code ci-dessous ne récupérera que le champ de courrier électronique dans chaque document:

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

Production

[
  {
    "email": "[email protected]"
  }
]
Zeeshan Ahmad
la source
3

La manière précise de le faire est d'utiliser la .project()méthode du curseur avec le nouveau pilote mongodbet nodejs.

var query = await dbSchemas.SomeValue.find({}).project({ name: 1, _id: 0 })
Ashh
la source
3
.project()fonctionne uniquement avec des agrégats. Si vous souhaitez l'utiliser avec find, utilisez le second argument de find({},{ name: 1, _id: 0 })method.
Sham
Non, avec le nouveau pilote de nœud mongodb, vous devez utiliser cette méthode. Mais avec la mangouste, vous pouvez utiliser le deuxième argument.
Ashh
1
ah, c'est dans le pilote nodejs.
Sham
Je ne comprends pas pourquoi, mais dans les nouvelles versions, @Anthony a raison ... Les versions inférieures, vous pouvez le faire de cette façon ... très salissant
ackuser
2

Par exemple,

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

0 signifie ignorer

1 signifie montrer

Nishant Shah
la source