Mongoose, Pilih bidang tertentu dengan temukan


121

Saya mencoba untuk memilih hanya bidang tertentu dengan

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

Tetapi dalam tanggapan json saya, saya juga menerima _id, skema dokumen saya hanya memiliki dua fiels, _id dan nama

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

Mengapa???

Jawaban:


201

The _idlapangan selalu hadir kecuali Anda secara eksplisit mengecualikan itu. Lakukan dengan menggunakan -sintaks:

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

Atau secara eksplisit melalui suatu objek:

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
Saya pikir .selecthanya filter untuk memilih bidang setelah Anda mendapatkan semua itu, rekomendasi saya adalah menggunakan.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')sepertinya tidak berfungsi?
Shanika Ediriweera

apakah ada cara untuk mendapatkan nilai secara langsung tanpa object seperti ['value1', 'value2', 'value3'] bukan ['name': 'value1', 'name': 'value2', 'name': 'nilai3']
M.Amer

66

Ada cara yang lebih singkat untuk melakukan ini sekarang:

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

Jika Anda ingin sebagian besar Schema fieldsdan ingin menghilangkan hanya sedikit, Anda dapat mengawali bidangname dengan -. Untuk mantan "-name"dalam argumen kedua akan tidak menyertakan namelapangan di doc sedangkan contoh yang diberikan di sini akan memiliki hanya satu namelapangan di docs kembali.


27
Bagi mereka yang ingin memfilter beberapa bidang, jangan pisahkan dengan koma, cukup spasi:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
bagi mereka yang ingin menggunakan klausa where di atas dbSchema.Somevalue.find ({userEmail:'test@test.com '},' userEmail -_id ', function (err, someValue)
user2180794

1
beberapa bidang akan menjadi ['name', 'field2', 'field3', 'etc'] bukan hanya 'name'
Eray T

24

Ada cara yang lebih baik untuk menanganinya menggunakan kode Native MongoDB di 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/

catatan:

var usersProjection

Daftar objek yang terdaftar di sini tidak akan dikembalikan / dicetak.


Bagaimana Anda melakukan ini dengan findOne?
zero_cool

kebutuhan kuisioner pada nama json array. Dengan metode Anda, kunci lain yang ada selain mereka juga akan datang seperti usia, dll
Ratan Uday Kumar

Luar biasa, persis seperti yang saya cari
Teja

9

Data DB

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

Pertanyaan

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

Keluaran:

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

Bekerja bermain sampel

tautan


4

Mengecualikan

Kode di bawah ini akan mengambil semua bidang selain kata sandi dalam setiap dokumen:

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

Keluaran

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

Sertakan

Kode di bawah ini hanya akan mengambil bidang email dalam setiap dokumen:

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

Keluaran

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

3

Cara yang tepat untuk melakukannya adalah dengan menggunakan .project()metode kursor dengan new mongodbdan nodejsdriver.

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

3
.project()bekerja hanya dengan agregat. Jika Anda ingin menggunakannya dengan find gunakan argumen kedua dalam find({},{ name: 1, _id: 0 })metode.
Sham

Tidak dengan driver node mongodb baru Anda harus menggunakan cara ini. Tetapi dengan luwak Anda bisa menggunakan argumen kedua.
Ashh

1
ah, itu ada di driver nodejs.
Sham

Tidak mengerti mengapa, tetapi di versi baru @Anthony benar ... Versi yang lebih rendah Anda dapat melakukannya dengan cara ini ... sangat berantakan
ackuser

2

Sebagai contoh,

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

0 berarti abaikan

1 cara menunjukkan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.