Mangusta, seleziona un campo specifico con Trova


121

Sto cercando di selezionare solo un campo specifico 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);
    });
};

Ma nella mia risposta json ricevo anche _id, lo schema del mio documento ha solo due campi, _id e nome

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

Perché???

Risposte:


201

Il _idcampo è sempre presente a meno che non lo escludi esplicitamente. Fallo usando la -sintassi:

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 esplicitamente tramite un oggetto:

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
Penso che sia .selectsolo un filtro per scegliere il campo dopo aver ottenuto tutto ciò, la mia raccomandazione è di usare.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')sembra non funzionare?
Shanika Ediriweera

c'è un modo per ottenere il valore direttamente senza un oggetto come ['valore1', 'valore2', 'valore3'] invece di ['nome': 'valore1', 'nome': 'valore2', 'nome': 'value3']
M.Amer

66

C'è un modo più breve per farlo ora:

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

Nel caso in cui si desideri la maggior parte di Schema fieldse si desideri ometterne solo alcuni, è possibile anteporre al campo nameun -. Ad esempio, "-name"il secondo argomento non includerà il namecampo nel documento mentre l'esempio fornito qui avrà solo il namecampo nei documenti restituiti.


27
Per coloro che desiderano filtrare più campi, non separarli con una virgola, ma solo uno spazio semplice:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
per coloro che desiderano utilizzare la clausola where
user2180794

1
più campi sarebbero ["nome", "campo2", "campo3", "ecc"] anziché solo "nome"
Eray T

24

C'è un modo migliore per gestirlo utilizzando il codice MongoDB nativo in 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

L'elenco degli oggetti elencati qui non verrà restituito / stampato.


Come puoi farlo con findOne?
zero_cool

il questionario richiede il nome dell'array json. con il tuo metodo ci sono altre chiavi che arriveranno come l'età, ecc.
Ratan Uday Kumar

Fantastico, proprio quello che stavo cercando
Teja

9

Dati DB

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

domanda

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

Produzione:

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

Parco giochi campione funzionante

collegamento


4

Escludere

Il codice seguente recupererà tutti i campi diversi dalla password all'interno di ogni documento:

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

Produzione

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

Includere

Il codice seguente recupererà solo il campo email all'interno di ciascun documento:

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

Produzione

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

3

Il modo preciso per farlo è utilizzare il .project()metodo del cursore con il nuovo driver mongodbe nodejs.

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

3
.project()funziona solo con aggregate. Se vuoi usarlo con find usa il secondo argomento in find({},{ name: 1, _id: 0 })method.
Sham

No, con il nuovo driver del nodo mongodb devi usare in questo modo. Ma con la mangusta puoi usare il secondo argomento.
Ashh

1
ah, è nel driver nodejs.
Sham

Non capisco perché, ma nelle nuove versioni @Anthony ha ragione ... Nelle versioni inferiori puoi farlo in questo modo ... molto disordinato
ackuser

2

Per esempio,

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

0 significa ignorare

1 significa spettacolo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.