Firavun faresi, bul ile belirli bir alan seçin


121

Sadece belirli bir alanı seçmeye çalışıyorum

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

Ancak json yanıtımda _id de alıyorum, belge şemamda yalnızca iki alan var, _id ve name

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

Neden???

Yanıtlar:


201

_idAçıkça bunu dışlamak sürece alan her zaman mevcuttur. Bunu -sözdizimini kullanarak yapın :

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

Veya açıkça bir nesne aracılığıyla:

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
Sanırım .selecthepsini aldıktan sonra alanı seçmek için bir filtre, benim tavsiyem kullanmaktır.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')çalışmıyor mu?
Shanika Ediriweera

['ad': 'değer1', 'ad': 'değer2', 'ad' yerine ['değer1', 'değer2', 'değer3'] gibi bir nesne olmadan değeri doğrudan almanın bir yolu var mı: '
değer3

67

Şimdi bunu yapmanın daha kısa bir yolu var:

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

Eğer en istemek Schema fieldsve sadece birkaç ihmal istiyorum, alanı öneki namebir ile -. Ex "-name"ikinci argüman olacak değil kapsar nameBurada verilen örnek olacak oysa doc alanına sadecename döndü dokümanlar alanına.


28
Birden fazla alanı filtrelemek isteyenler için, onları virgülle blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
ayırmayın

1
yukarıdaki dbSchema.Somevalue.find ({userEmail:'test@test.com '},' userEmail -_id ', function (err, someValue)
user2180794

1
birden fazla alan yalnızca 'ad' yerine ['ad', 'alan2', 'alan3', 'vb'] olacaktır
Eray T

24

Mongoose'da Yerel MongoDB kodunu kullanmanın daha iyi bir yolu var.

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/

Not:

var usersProjection

Burada listelenen nesnelerin listesi iade edilmeyecek / yazdırılmayacaktır.


Bunu findOne ile nasıl yaparsınız?
zero_cool

anket adı json dizisine ihtiyaç duyar. yönteminizle diğer anahtarlar da var, onlar da yaş gibi gelecek vb.
Ratan Uday Kumar

Harika, tam da aradığım şey
Teja

9

DB Verileri

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

Sorgu

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

Çıktı:

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

Çalışma örnek oyun alanı

bağlantı


4

dışlamak

Aşağıdaki kod, her belgedeki şifre dışındaki tüm alanları alacaktır:

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

Çıktı

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

Dahil etmek

Aşağıdaki kod, her belgede yalnızca e-posta alanını alır:

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

Çıktı

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

3

Bunu yapmanın kesin yolu .project(), yeni mongodbve nodejssürücüyle imleç yöntemini kullanmaktır .

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

3
.project()yalnızca toplu olarak çalışır. Find ile kullanmak istiyorsanız, find({},{ name: 1, _id: 0 })yöntemde ikinci argümanı kullanın .
Sham

Hayır, yeni mongodb düğüm sürücüsüyle bu şekilde kullanmanız gerekir. Ancak firavun faresi ile ikinci argümanı kullanabilirsiniz.
Ashh

1
ah, nodejs sürücüsünde.
Sham

Nedenini anlamayın, ancak yeni sürümlerde @ Anthony haklı ... Daha düşük sürümlerde bunu bu şekilde yapabilirsiniz ... çok dağınık
ackuser

2

Örneğin,

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

0 yok saymak demektir

1 demek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.