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

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

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.


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.


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


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": "example@example.com"
  }
]

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": "example@example.com"
  }
]

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.