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

TlonXP
sumber

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);
    });
};
Neil Lunn
sumber
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.

Akash
sumber
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:'[email protected] '},' 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.

ElvinD
sumber
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

Ratan Uday Kumar
sumber
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": "[email protected]"
  }
]

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": "[email protected]"
  }
]
Zeeshan Ahmad
sumber
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 })
Ashh
sumber
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

Nishant Shah
sumber