Mungo, Wählen Sie ein bestimmtes Feld mit Suchen aus

120

Ich versuche nur ein bestimmtes Feld mit auszuwählen

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

Aber in meiner json-Antwort erhalte ich auch die _id, mein Dokumentschema hat nur zwei Felder, _id und name

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

Warum???

TlonXP
quelle

Antworten:

199

Das _idFeld ist immer vorhanden, sofern Sie es nicht ausdrücklich ausschließen. Verwenden Sie dazu die folgende -Syntax:

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

Oder explizit über ein Objekt:

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
quelle
1
Ich denke, es ist .selectnur ein Filter, um ein Feld auszuwählen, nachdem Sie all das erhalten haben. Meine Empfehlung lautet.find({}, 'name -_id')
hong4rc
3
@ Hongarc .find({}, 'name -_id')scheint nicht zu funktionieren?
Shanika Ediriweera
Gibt es eine Möglichkeit, den Wert direkt ohne ein Objekt wie ['Wert1', 'Wert2', 'Wert3'] anstelle von ['Name': 'Wert1', 'Name': 'Wert2', 'Name' zu erhalten: 'value3']
M.Amer
66

Es gibt jetzt einen kürzeren Weg, dies zu tun:

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

Wenn Sie die meisten davon Schema fieldsmöchten und nur einige weglassen möchten, können Sie dem Feld nameein vorangestellt haben -. Für die Ex "-name"im zweiten Argument wird nicht enthalten nameFeld in der doc , während die hier gegebenen Beispiel haben nur das nameFeld in den zurückgegebenen Dokumente.

Akash
quelle
27
Für diejenigen, die mehrere Felder filtern möchten, trennen Sie sie nicht durch Komma, sondern nur durch Leerzeichen:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave
1
für diejenigen, die die where-Klausel oben verwenden möchten dbSchema.Somevalue.find ({userEmail:'[email protected] '},' userEmail -_id ', Funktion (err, someValue)
user2180794
1
Mehrere Felder wären ['Name', 'Feld2', 'Feld3', 'usw.'] anstelle von nur 'Name'
Eray T
24

Es gibt eine bessere Möglichkeit, mit Native MongoDB-Code in Mongoose damit umzugehen.

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/

Hinweis:

var usersProjection

Die Liste der hier aufgeführten Objekte wird nicht zurückgegeben / gedruckt.

ElvinD
quelle
Wie machst du das mit findOne?
zero_cool
Fragebogen muss auf Name JSON Array. mit Ihrer Methode sind andere Schlüssel da, als sie auch wie Alter usw. kommen werden
Ratan Uday Kumar
Genial, genau das, wonach ich gesucht habe
Teja
9

DB-Daten

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

Abfrage

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

Ausgabe:

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

Arbeitsprobenspielplatz

Verknüpfung

Ratan Uday Kumar
quelle
4

Ausschließen

Der folgende Code ruft alle Felder außer dem Passwort in jedem Dokument ab:

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

Ausgabe

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

Einschließen

Der folgende Code ruft nur das E-Mail-Feld in jedem Dokument ab:

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

Ausgabe

[
  {
    "email": "[email protected]"
  }
]
Zeeshan Ahmad
quelle
3

Der genaue Weg, dies zu tun, besteht darin, die .project()Cursormethode mit dem neuen mongodbund dem nodejsTreiber zu verwenden.

var query = await dbSchemas.SomeValue.find({}).project({ name: 1, _id: 0 })
Ashh
quelle
3
.project()funktioniert nur mit Aggregat. Wenn Sie es mit find verwenden möchten, verwenden Sie das zweite Argument in find({},{ name: 1, _id: 0 })method.
Schein
Nein, mit dem neuen Mongodb-Knotentreiber müssen Sie diese Methode verwenden. Aber mit Mungo können Sie das zweite Argument verwenden.
Ashh
1
ah, es ist in nodejs Treiber.
Schein
Ich verstehe nicht warum, aber in neuen Versionen ist @Anthony richtig ... Niedrigere Versionen können Sie auf diese Weise tun ... sehr chaotisch
ackuser
2

Beispielsweise,

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

0 bedeutet ignorieren

1 bedeutet zeigen

Nishant Shah
quelle