พังพอนเลือกช่องเฉพาะด้วยการค้นหา


121

ฉันพยายามเลือกเฉพาะฟิลด์ที่เฉพาะเจาะจงด้วย

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

แต่ในการตอบกลับ json ของฉันฉันได้รับ _id สคีมาเอกสารของฉันมีเพียงสอง fiels _id และชื่อ

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

ทำไม???

คำตอบ:


201

_idข้อมูลเป็นปัจจุบันอยู่เสมอเว้นแต่ว่าคุณได้ยกเว้น โดยใช้-ไวยากรณ์:

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

หรือโดยชัดแจ้งผ่านวัตถุ:

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
ฉันคิดว่า.selectเป็นเพียงตัวกรองสำหรับเลือกฟิลด์หลังจากที่คุณได้รับทั้งหมดแล้วคำแนะนำของฉันคือใช้.find({}, 'name -_id')
hong4rc

3
@Hongarc .find({}, 'name -_id')ดูเหมือนจะไม่ทำงาน?
Shanika Ediriweera

มีวิธีรับค่าโดยตรงโดยไม่มี obj เช่น ['value1', 'value2', 'value3'] แทน ['name': 'value1', 'name': 'value2', 'name': 'value3']
M. เมษายน

67

ตอนนี้มีวิธีที่สั้นกว่านี้:

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

ในกรณีที่คุณต้องการส่วนใหญ่Schema fieldsและต้องการเว้นเพียงบางส่วนคุณสามารถนำหน้าฟิลด์nameด้วย a -. สำหรับอดีต"-name"ในการโต้เถียงที่สองจะไม่รวมถึงnameข้อมูลในเอกสารในขณะที่ตัวอย่างให้ที่นี่จะมีเพียงnameเขตข้อมูลในเอกสารที่ส่งคืน


28
สำหรับผู้ที่ต้องการกรองหลายช่องอย่าคั่นด้วยลูกน้ำเพียงแค่เว้นวรรค:blogItemModel.find({}, 'title intro_image intro_text publish_date', function(err, blog_items){..
Starwave

1
สำหรับผู้ที่ต้องการใช้โดยที่ clause ในด้านบน dbSchema.Somevalue.find ({userEmail:'test@test.com '},' userEmail -_id ', function (err, someValue)
user2180794

1
หลายช่องจะเป็น ['name', 'field2', 'field3', 'etc'] แทนที่จะเป็น 'name'
Eray T

24

มีวิธีที่ดีกว่าในการจัดการโดยใช้รหัส Native MongoDB ใน 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/

บันทึก:

var usersProjection

รายการวัตถุที่แสดงที่นี่จะไม่ถูกส่งคืน / พิมพ์


คุณทำสิ่งนี้กับ findOne ได้อย่างไร?
zero_cool

แบบสอบถามความต้องการเกี่ยวกับอาร์เรย์ชื่อ json ด้วยวิธีการของคุณคีย์อื่น ๆ จะมีมากกว่าที่จะมาเช่นอายุ ฯลฯ
Ratan Uday Kumar

ยอดเยี่ยมสิ่งที่ฉันกำลังมองหา
Teja

9

ข้อมูล DB

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

สอบถาม

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

เอาท์พุท:

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

สนามเด็กเล่นตัวอย่างการทำงาน

ลิงค์


4

ไม่รวม

ด้านล่างรหัสจะดึงข้อมูลฟิลด์ทั้งหมดนอกเหนือจากรหัสผ่านภายในเอกสารแต่ละฉบับ:

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

เอาท์พุต

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

ประกอบด้วย

ด้านล่างรหัสจะดึงข้อมูลอีเมลในแต่ละเอกสารเท่านั้น:

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

เอาท์พุต

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

3

วิธีที่แม่นยำในการทำเช่นนี้คือการใช้.project()วิธีเคอร์เซอร์กับไดรเวอร์ใหม่mongodbและnodejs

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

3
.project()ใช้งานได้กับการรวมเท่านั้น หากคุณต้องการใช้กับ find use second อาร์กิวเมนต์ในfind({},{ name: 1, _id: 0 })method
แชม

ไม่ด้วยไดรเวอร์โหนด mongodb ใหม่คุณต้องใช้วิธีนี้ แต่ด้วยพังพอนคุณสามารถใช้อาร์กิวเมนต์ที่สองได้
Ashh

1
อามันอยู่ในไดรเวอร์ nodejs
แชม

ไม่เข้าใจว่าทำไม แต่ในเวอร์ชันใหม่ @Anthony ถูกต้อง ... รุ่นล่างคุณทำได้แบบนี้ ... ยุ่งมาก
ackuser

2

ตัวอย่างเช่น,

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

0 หมายถึงละเว้น

1 หมายถึงการแสดง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.