Mongoose, Chọn một trường cụ thể với tìm


121

Tôi đang cố gắng chỉ chọn một trường cụ thể với

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

Nhưng trong phản hồi json của tôi, tôi cũng nhận được _id, giản đồ tài liệu của tôi chỉ có hai phần chính là _id và tên

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

Tại sao???

Câu trả lời:


200

Trường _idluôn hiện diện trừ khi bạn loại trừ nó một cách rõ ràng. Làm như vậy bằng -cú pháp:

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

Hoặc rõ ràng thông qua một đối tượng:

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
Tôi nghĩ rằng .selectchỉ là một bộ lọc để lựa chọn lĩnh vực sau khi bạn nhận được tất cả điều đó, đề nghị của tôi là sử dụng.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')dường như không hoạt động?
Shanika Ediriweera

có cách nào để lấy giá trị trực tiếp mà không có đối tượng như ['value1', 'value2', 'value3'] thay vì ['name': 'value1', 'name': 'value2', 'name': 'value3']
M.Amer

66

Có một cách ngắn hơn để làm điều này bây giờ:

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

Trong trường hợp bạn muốn hầu hết Schema fieldsvà chỉ muốn bỏ qua một số ít, bạn có thể đặt tiền tố trường namebằng a -. Đối với cựu "-name"trong đối số thứ hai sẽ không bao gồm namelĩnh vực trong doc trong khi ví dụ đưa ra ở đây sẽ có chỉ các namelĩnh vực trong các tài liệu trả về.


27
Đối với những người muốn lọc nhiều trường, không phân tách chúng bằng dấu phẩy, chỉ cần khoảng trắng:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
dành cho những người muốn sử dụng mệnh đề where trong dbSchema.Somevalue.find
user2180794

1
nhiều trường sẽ là ['name', 'field2', 'field3', 'etc'] thay vì chỉ là 'name'
Eray T

24

Có một cách tốt hơn để xử lý nó bằng cách sử dụng mã Native MongoDB trong 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/

Ghi chú:

var usersProjection

Danh sách các đối tượng được liệt kê ở đây sẽ không được trả lại / in ra.


Làm thế nào để bạn làm điều này với findOne?
zero_cool

bảng câu hỏi cần trên mảng tên json. với phương pháp của bạn quan trọng khác là có hơn những gì họ cũng sẽ đến như tuổi tác, vv
Ratan Uday Kumar

Tuyệt vời, chỉ là những gì tôi đang tìm kiếm
Teja

9

Dữ liệu DB

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

Truy vấn

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

Đầu ra:

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

Sân chơi mẫu làm việc

liên kết


4

Loại trừ

Đoạn mã dưới đây sẽ truy xuất tất cả các trường không phải mật khẩu trong mỗi tài liệu:

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

Đầu ra

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

Bao gồm

Mã dưới đây sẽ chỉ truy xuất trường email trong mỗi tài liệu:

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

Đầu ra

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

3

Cách chính xác để làm điều này là sử dụng .project()phương thức con trỏ với trình điều khiển mongodbvà mới nodejs.

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

3
.project()chỉ hoạt động với tổng hợp. Nếu bạn muốn sử dụng nó với đối số thứ hai find, hãy sử dụng trong find({},{ name: 1, _id: 0 })phương thức.
Sham

Không với trình điều khiển nút mongodb mới, bạn phải sử dụng theo cách này. Nhưng với mongoose, bạn có thể sử dụng đối số thứ hai.
Ashh

1
à, nó nằm trong trình điều khiển nodejs.
Sham

Không hiểu tại sao, nhưng trong các phiên bản mới @Anthony là đúng ... Các phiên bản thấp hơn bạn có thể làm theo cách này ... rất lộn xộn
ackuser 13/09/18

2

Ví dụ,

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

0 nghĩa là bỏ qua

1 nghĩa là chương trình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.