MongoDB เลือกตำแหน่งของ _id?


96

เป็นไปได้ใน mongo db เพื่อเลือกเอกสารของคอลเลกชันเช่นใน SQL:

SELECT * FROM collection WHERE _id IN (1,2,3,4);

หรือถ้าฉันมี_id arrayฉันต้องเลือกทีละรายการแล้วจัดองค์ประกอบarray/objectของผลลัพธ์ใหม่?

คำตอบ:


171

ง่าย :)

db.collection.find( { _id : { $in : [1,2,3,4] } } );

นำมาจาก: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in


เรายังคงได้รับประโยชน์จากการจัดทำดัชนีหรือไม่? ID ในกรณีนั้นจะถูกส่งผ่านเป็นสตริงธรรมดา ...
Rafal Pastuszak

2
คุณทำ. อย่างไรก็ตามความซับซ้อนของเวลาเป็นเส้นตรง (n) ไม่ใช่ลอการิทึม / ค่าคงที่ หากไม่มีดัชนีจะเป็น n ^ 2
Petr Brazdil

คือมันไม่ได้O(log(n) * m)ที่nมีขนาดของคอลเลกชันและmเป็นจำนวนของรหัสผ่าน?
Guig

8
คุณต้องใช้ฟังก์ชัน ObjectId ถ้า "_id" คือ ID object - {_id: {$ in: [ObjectId ("5a633609670aeb6f93b88b23")]}}
Pax Beach

5

list คืออาร์เรย์ของรหัส

ในรายการรหัสนี้คืออาร์เรย์ของรหัสในคอลเล็กชันผู้ใช้

var list = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"]

    .find({ _id: {$in : list}})

4
รหัสไม่ทำงาน ดูเหมือนว่าจะต้องตั้งค่า ID เป็น ObjectId ("5883d387971bb840b7399130")
Pax Beach

1

เนื่องจาก mongodb ใช้bsonและสำหรับ bson เป็นประเภทแอตทริบิวต์ที่สำคัญ และเนื่องจาก_idเป็นObjectIdคุณต้องใช้เช่นนี้

db.collection.find( { _id : { $in : [ObjectId('1'),ObjectId('2')] } } );

และในการmongodb compassใช้งานเช่นนี้:

{ "_id" : { $in : [ObjectId('1'),ObjectId('2')] } }

หมายเหตุ: objectId ในสตริงมี24ความยาว


0

หากคุณต้องการค้นหาโดยผู้ใช้และตามฟิลด์อื่นอย่างมีเงื่อนไขคุณสามารถทำได้อย่างง่ายดายเช่นด้านล่างด้วยตัวดำเนินการสเปรดและเทอร์นารีโดยใช้aggregateและmatch

 const p_id = patient_id;
    let fetchingReports = await Reports.aggregate([
      ...(p_id
        ? [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
                patient_id: p_id,
              },
            },
          ]
        : [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
              },
            },
        

0

คุณสามารถลองสิ่งนี้

var ids = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"];

var oids = [];
ids.forEach(function(item){
oids.push(new ObjectId(item));
});

.find({ _id: {$in : oids}})

-4

สิ่งนี้ไม่เกี่ยวข้องกับคำค้นหา mongo ฉันคุ้นเคยกับ SQL และใช้ Studio3T IDE เพื่อสอบถามฐานข้อมูล mongo โดยใช้ SQL หากคุณเป็นเหมือนฉันฉันต้องการชี้ให้เห็นว่าค่ารหัสจำเป็นต้องพิมพ์ ดังนั้นแบบสอบถามจะมีลักษณะดังนี้:

SELECT _id from <collectionName>
WHERE _id = ObjectId("5883d387971bb840b7399130");

2
สิ่งนี้ไม่ได้ตอบคำถามเลย
loctrice

ไม่ตอบตกลง อาจช่วยได้กับ IDE บางอย่างเช่น Studio3T ซึ่งให้คุณโต้ตอบกับ mongoDB โดยใช้ SQL มีคำตอบมีใบสมัคร นอกจากนี้ยังเป็นการเน้นว่าแม้ในกรณีนั้นจะต้องมีการส่งประเภท _id
sourabhxiii

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