วิธีการเลือกเขตข้อมูลเดียวสำหรับเอกสารทั้งหมดในคอลเลกชัน MongoDB?


223

ใน MongoDB ของฉันฉันมีคอลเลกชันของนักเรียนที่มี 10 บันทึกที่มีสาขาและname rollหนึ่งบันทึกของคอลเลกชันนี้คือ:

{
    "_id" : ObjectId("53d9feff55d6b4dd1171dd9e"),
    "name" : "Swati",
    "roll" : "80",
}

ฉันต้องการดึงข้อมูลฟิลด์rollสำหรับบันทึกทั้ง 10 รายการในคอลเล็กชันเท่าที่เราจะทำได้ในฐานข้อมูลดั้งเดิมโดยใช้:

SELECT roll FROM student

ฉันไปผ่านบล็อกจำนวนมาก แต่ทั้งหมดเกิดจากการสืบค้นซึ่งจะต้องมีWHEREข้อในตัวอย่างเช่น:

db.students.find({ "roll": { $gt: 70 })

แบบสอบถามเทียบเท่ากับ:

SELECT * FROM student WHERE roll > 70

ความต้องการของฉันคือการหาคีย์เดียวเท่านั้นโดยไม่มีเงื่อนไขใด ๆ ดังนั้นการดำเนินการแบบสอบถามสำหรับสิ่งที่


@NeilLunn ขอบคุณสำหรับการเชื่อมโยงSQL เพื่อ MongoDB แมป ไม่รู้ว่าฉันจะพลาดสิ่งนี้ได้อย่างไร
Shipra Swati

คำตอบ:


255

จากMongoDB เอกสาร :

เส้นโครงสามารถรวมหลายช่องได้อย่างชัดเจน ในการดำเนินการดังต่อไปนี้ find () วิธีการส่งกลับเอกสารทั้งหมดที่ตรงกับแบบสอบถาม ในชุดผลลัพธ์เฉพาะฟิลด์รายการและจำนวนเท่านั้นและโดยค่าเริ่มต้นฟิลด์ _id จะส่งคืนเอกสารที่ตรงกัน

db.inventory.find ({type: 'food'}, {item: 1, จำนวน: 1})

ในตัวอย่างนี้จาก folks ที่ Mongo เอกสารกลับมาจะมีเพียงสาขาของitem, และqty_id


ดังนั้นคุณควรจะสามารถออกคำสั่งเช่น:

db.student.find({}, {roll:1, _id:0})

ข้อความด้านบนจะเลือกเอกสารทั้งหมดในคอลเล็กชันนักเรียนและเอกสารที่ส่งคืนจะส่งคืนเฉพาะrollฟิลด์ (และไม่รวม_id)

ถ้าเราไม่ได้พูดถึง_id:0เขตข้อมูลที่ส่งกลับจะเป็นและroll _idฟิลด์ '_id' จะปรากฏขึ้นตามค่าเริ่มต้นเสมอ ดังนั้นเราต้องพูดถึงอย่างชัดเจน_id:0rollพร้อมกับ


9
ดูเหมือนว่า Google จะไม่สามารถทำได้ดังนั้นควรลองดู คุณต้องแยกฟิลด์ทั้งหมดที่คุณไม่ต้องการอย่างชัดเจนหรือไม่? สมมติว่าคุณต้องการเพียงหนึ่งฟิลด์ แต่เอกสารมี 10 รายการที่คุณต้องตั้งค่า0เป็น 9 ฟิลด์อย่างชัดเจนหรือไม่ แก้ไข: ไม่เป็นไรไม่รวม_idคือ{field_I_want:1, _id:0}ดูเหมือนว่าจะทำงาน
คาร์ล Tryggvason

เป็นไปได้หรือไม่ที่จะเพิ่มเขตข้อมูลจากนั้นอัปเดตเอกสารหากฉันใช้การคาดการณ์
chovy

3
ไม่มีคำตอบที่กล่าวถึงจริง ๆ ต่อไปนี้: หมายเหตุ: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.นี่อาจเป็นที่น่าสนใจสำหรับคุณบางคน ( แหล่งที่มา )
user0800

137

รับข้อมูลทั้งหมดจากตาราง

db.student.find({})

เลือก * จากนักเรียน


รับข้อมูลทั้งหมดจากตารางโดยไม่มี _id

db.student.find({}, {_id:0})

เลือกชื่อม้วนจากนักเรียน


รับข้อมูลทั้งหมดจากฟิลด์เดียวด้วย _id

db.student.find({}, {roll:1})

เลือก id ม้วนจากนักเรียน


รับข้อมูลทั้งหมดจากฟิลด์เดียวโดยไม่มี _id

db.student.find({}, {roll:1, _id:0})

เลือกม้วนจากนักเรียน


ค้นหาข้อมูลที่ระบุโดยใช้คำสั่ง

db.student.find({roll: 80})

SELECT * จากนักเรียน WHERE roll = '80'


ค้นหาข้อมูลโดยใช้ตำแหน่งข้อและมากกว่าเงื่อนไข

db.student.find({ "roll": { $gt: 70 }}) // $gt is greater than 

เลือก * จากนักเรียนที่ม้วน> '70'


ค้นหาข้อมูลโดยใช้ตำแหน่งและมากกว่าหรือเท่ากับเงื่อนไข

db.student.find({ "roll": { $gte: 70 }}) // $gte is greater than or equal

SELECT * จากนักเรียน WHERE roll> = '70'


ค้นหาข้อมูลโดยใช้ตำแหน่งและน้อยกว่าหรือเท่ากับเงื่อนไข

db.student.find({ "roll": { $lte: 70 }}) // $lte is less than or equal

SELECT * จากนักเรียน WHERE roll <= '70'


ค้นหาข้อมูลโดยใช้ตำแหน่งและน้อยกว่าไปตามเงื่อนไข

db.student.find({ "roll": { $lt: 70 }})  // $lt is less than

SELECT * จากนักเรียน WHERE roll <'70'



2
แค่ต้องการเพิ่มเนื่องจากคำตอบของคุณช่วยฉันหาวิธีแก้ปัญหาเพื่อแสดงคุณสมบัติทั้งหมดยกเว้น _id จะdb.student.find({}, {_id:0})ขอบคุณสำหรับความช่วยเหลือ
user8675309

58

ฉันคิดว่า mattingly890 มีคำตอบที่ถูกต้องนี่เป็นอีกตัวอย่างพร้อมกับลวดลาย / commmand

db.collection.find( {}, {your_key:1, _id:0})

ป้อนคำอธิบายรูปภาพที่นี่


เพื่อแสดงผลออกมาจาก Mongo และสิ่งที่มันกลับมาเป็นตัวอย่าง
grepit

เพื่อนของคุณให้ฉันลงคะแนนเพราะฉันได้รวมภาพหน้าจอในคำตอบของฉัน?
grepit

ใช่แล้วและเพราะฉันไม่เห็นว่าคำตอบของคุณนำอะไรใหม่มาจาก @therealrootuser 's anwer
Guillaume Lebreton

10

ที่นี่คุณไป 3 วิธีในการทำสั้นที่สุดที่น่าเบื่อ:

db.student.find({}, 'roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}).select('roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}, {'roll' : 1 , '_id' : 1 ); // <---- Old lengthy boring way

ในการลบ-โอเปอเรเตอร์การใช้งานเฉพาะ:

db.student.find({}).select('roll -_id') // <--- Will remove id from result

1
ฉันคิดว่าคำสั่งที่คุณกล่าวถึงนั้นมาจาก mongoose ไม่ใช่ mongodb ยกเว้นอันที่สาม
Ashish

8

เพียงเพื่อการศึกษาคุณสามารถทำได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

1

    var query = {"roll": {$gt: 70};
    var cursor = db.student.find(query);
    cursor.project({"roll":1, "_id":0});

2

    var query = {"roll": {$gt: 70};
    var projection = {"roll":1, "_id":0};
    var cursor = db.student.find(query,projection);

`


8

ลองใช้แบบสอบถามต่อไปนี้:

db.student.find({}, {roll: 1, _id: 0}).pretty();

หวังว่านี่จะช่วยได้ !!


พริตตี้ () จะมีประโยชน์เมื่อทำการเรียกใช้ผ่านเชลล์ไม่ใช่จากสคริปต์
Dinakar

7
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

ในตัวอย่างของคุณคุณสามารถทำสิ่งที่ชอบ:

db.students.find({}, {"roll":true, "_id":false})

ติ่ง

พารามิเตอร์การฉายจะกำหนดว่าจะส่งคืนฟิลด์ใดในเอกสารที่ตรงกัน พารามิเตอร์การฉายภาพนำเอกสารของแบบฟอร์มต่อไปนี้:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 หรือจริงเพื่อรวมฟิลด์ในเอกสารการส่งคืน

  2. 0 หรือเท็จเพื่อยกเว้นฟิลด์

บันทึก

สำหรับฟิลด์ _id คุณไม่จำเป็นต้องระบุ _id: 1 อย่างชัดเจนเพื่อส่งคืนฟิลด์ _id เมธอด find () จะส่งคืนฟิลด์ _id เสมอยกเว้นว่าคุณระบุ _id: 0 เพื่อไม่ให้ฟิลด์

อ่านเพิ่มเติม


7

ในขณะที่คำตอบของ gowthamเสร็จสมบูรณ์มันก็คุ้มค่าที่จะสังเกตว่าคำสั่งเหล่านั้นอาจแตกต่างจากบน API ไปยังอีก (สำหรับผู้ที่ไม่ได้ใช้เปลือกของ mongo)
โปรดอ้างอิงลิงค์เอกสารสำหรับข้อมูลรายละเอียด

ตัวอย่างเช่นNodejsมีวิธีที่เรียกว่า `projection ที่คุณจะผนวกเข้ากับฟังก์ชัน find ของคุณเพื่อฉายภาพ

การทำตามตัวอย่างชุดเดียวกันคำสั่งเช่นนี้สามารถใช้กับ Node ได้:

db.student.find({}).project({roll:1})

SELECT _id ม้วนจากนักเรียน

หรือ
db.student.find({}).project({roll:1, _id: 0})

เลือกม้วนจากนักเรียน

และอื่น ๆ

อีกครั้งสำหรับผู้ใช้ nodejs อย่าลืม (สิ่งที่คุณควรคุ้นเคยถ้าคุณใช้ API นี้มาก่อน) เพื่อใช้toArrayในการผนวก.thenคำสั่งของคุณ


4

เพื่อความเข้าใจที่ดีขึ้นฉันได้เขียนแบบสอบถาม MySQL ที่คล้ายกัน

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {ชื่อ: จริงอีเมล: จริงโทรศัพท์: จริง});

MySQL:เลือกชื่ออีเมลโทรศัพท์จาก table_name;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({อีเมล:'you@email.com '}, {ชื่อ: จริงอีเมล: จริงโทรศัพท์: จริง});

MySQL:เลือกชื่ออีเมลโทรศัพท์จาก table_name WHERE email = 'you@email.com';


3

มันใช้งานได้สำหรับฉัน

db.student.find({},{"roll":1})

ไม่มีเงื่อนไขในกรณีที่ประโยคเช่นภายในวงเล็บปีกกาแรก ภายในเครื่องหมายปีกกาถัดไป: รายการชื่อฟิลด์การฉายที่ต้องการในผลลัพธ์และ 1 หมายถึงฟิลด์เฉพาะเป็นส่วนหนึ่งของผลการสืบค้น


2

ได้รับชื่อของนักเรียน

student-details = db.students.find({{ "roll": {$gt: 70} },{"name": 1, "_id": False})

รับชื่อและม้วนของนักเรียน

student-details = db.students.find({{ "roll": {$gt: 70}},{"name": 1,"roll":1,"_id": False})

2

แบบสอบถามสำหรับค่าธรรมเนียม MongoDB ที่นี่คือการรวบรวมและคำอธิบายเป็นฟิลด์

db.getCollection('fees').find({},{description:1,_id:0})

1

ถ้าคุณต้องการดึงข้อมูลฟิลด์ "ม้วน" สำหรับ 10 ระเบียนทั้งหมดในคอลเลกชันเท่านั้น จากนั้นลองสิ่งนี้

ใน MongoDb:

db.students.find ({}, {"roll": {"$ roll"})

ใน SQL:

เลือกม้วนจากนักเรียน


1

ฉันต้องการเพิ่มคำตอบที่ว่าถ้าคุณต้องการแสดงเขตข้อมูลที่ซ้อนในวัตถุอื่นคุณสามารถใช้ไวยากรณ์ต่อไปนี้

db.collection.find( {}, {{'object.key': true}})

ที่นี่มีคีย์อยู่ภายในวัตถุชื่อวัตถุ

{ "_id" : ObjectId("5d2ef0702385"), "object" : { "key" : "value" } }

0
db.student.find({}, {"roll":1, "_id":0})

นี่เทียบเท่ากับ -

เลือกม้วนจากนักเรียน



db.student.find ({}, {"ม้วน": 1, "ชื่อ": 1, "_id": 0})

นี่เทียบเท่ากับ -

เลือกม้วนชื่อจากนักเรียน


0

ใช้ Query แบบนี้ในเปลือก:

1. การใช้งานdatabase_name

e.g: use database_name

2.ซึ่งจะส่งคืนเฉพาะข้อมูลฟิลด์ที่เฉพาะเจาะจงเมื่อจับคู่_id:0ระบุว่าจะไม่แสดง ID ในผลลัพธ์

db.collection_name.find( { "Search_Field": "value" }, 
                  { "Field_to_display": 1,_id:0 }  )

0

ใน mongodb 3.4 เราสามารถใช้ตรรกะข้างล่างนี้ฉันไม่แน่ใจเกี่ยวกับรุ่นก่อนหน้า

เลือกม้วนจากนักเรียน ==> db.student.find (! {}, {ม้วน: 1})

ตรรกะข้างต้นช่วยในการกำหนดคอลัมน์บางอย่าง (ถ้ามีน้อยกว่า)


0

ใช้ Studio 3T สำหรับ MongoDB ถ้าฉันใช้.find({}, { _id: 0, roll: true })มันยังคงส่งคืนอาร์เรย์ของวัตถุที่มี_idคุณสมบัติว่างเปล่า

การใช้ JavaScript mapช่วยให้ฉันเรียกค้นrollคุณสมบัติที่ต้องการเป็นอาร์เรย์ของสตริงเท่านั้น:

var rolls = db.student
  .find({ roll: { $gt: 70 } }) // query where role > 70
  .map(x => x.roll);           // return an array of role

0

ไม่แน่ใจว่านี่ตอบคำถาม แต่ฉันเชื่อว่ามันคุ้มค่าที่จะกล่าวถึงที่นี่ มีอีกวิธีหนึ่งในการเลือกเขตข้อมูลเดียว (และไม่ใช่หลายเขต) โดยใช้db.collection_name.distinct();

เช่น,db.student.distinct('roll',{});

หรือวิธีที่สอง: การใช้db.collection_name.find().forEach();(สามารถเลือกหลายช่องได้ที่นี่ด้วยการต่อข้อมูล)

เช่น, db.collection_name.find().forEach(function(c1){print(c1.roll);});

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