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

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

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.


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:'test@test.com '},' 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.


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


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

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.