ฉันจะค้นหาวัตถุโดย ObjectId ของมันในคอนโซล mongo ได้อย่างไร


265

ฉันพบคำถามนี้ตอบสำหรับ C # และ Perl แต่ไม่ใช่ในอินเทอร์เฟซดั้งเดิม ฉันคิดว่ามันจะทำงาน:

db.theColl.find( { _id: ObjectId("4ecbe7f9e8c1c9092c000027") } )

แบบสอบถามไม่มีผลลัพธ์ ฉันพบ 4ecbe7f9e8c1c9092c000027 โดยทำdb.theColl.find()และคว้า ObjectId มีวัตถุหลายพันรายการในคอลเลกชันนั้น

ฉันได้อ่านหน้าทั้งหมดที่ฉันสามารถหาได้ในเว็บไซต์ mongodb.org และไม่พบมัน นี่เป็นเรื่องแปลกที่ต้องทำใช่ไหม มันค่อนข้างปกติสำหรับฉัน

คำตอบ:


417

ไม่แปลกเลยที่ทุกคนทำสิ่งนี้ตลอดเวลา ตรวจสอบให้แน่ใจว่าชื่อคอลเลกชันนั้นถูกต้อง (ตัวพิมพ์เล็ก) และ ObjectId นั้นถูกต้อง

เอกสารอยู่ที่นี่

> db.test.insert({x: 1})

> db.test.find()                                               // no criteria
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }      

> db.test.find({"_id" : ObjectId("4ecc05e55dd98a436ddcc47c")}) // explicit
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }

> db.test.find(ObjectId("4ecc05e55dd98a436ddcc47c"))           // shortcut
{ "_id" : ObjectId("4ecc05e55dd98a436ddcc47c"), "x" : 1 }

1
แปลกฉันรีสตาร์ทคอนโซลและก็ใช้งานได้ทันที มีวิธีในการเปลี่ยน "ขอบเขต" ของคุณหรือบางสิ่งบางอย่างที่บรรทัดคำสั่งและไม่ทราบจริง ๆ หรือไม่
jcollum

ไม่น่าแปลกใจ: เมื่อฉันค้นหา 'พบ ObjectID' หน้าเว็บที่ไม่ได้ขึ้นมา: mongodb.org/...
jcollum

1
ใช่คุณอาจพิมพ์ "ใช้ dbname" โดยไม่ตั้งใจและเปลี่ยนฐานข้อมูล ฉันสมมติว่าคุณไม่ได้ใช้การจำลองแบบหรือการแยกชิ้นส่วนซึ่งจะสร้างความเป็นไปได้อื่น ๆ อย่างชัดเจนว่าทำไมถึงไม่ปรากฏขึ้น
Tyler Brock

1
ปัญหาคือฉันไม่ได้ใส่เครื่องหมายคำพูดรอบ _id ของฉัน
jcollum

9
ว้าวฉันไม่รู้ว่านี่เป็นสิ่งที่พิเศษใน MongoDB เสียเวลาสักหน่อยเมื่อคิดว่าปัญหาของฉันอยู่ที่อื่น แต่การค้นหามันต้องใช้กฎเพิ่มเติม สำหรับสิ่งที่ควรค่าแก่การใช้ express และ node จะต้องใช้ ObjectId exp ... var ObjectId = require ('mongodb') ObjectID;
Chris Hawkes

87

หากคุณใช้ Node.js:

> var ObjectId = require('mongodb').ObjectId; 
> var id = req.params.gonderi_id;       
> var o_id = new ObjectId(id);
> db.test.find({_id:o_id})

แก้ไข: แก้ไขเป็น ObjectId ใหม่ (id) ไม่ใช่ ObjectID ใหม่ (id)


5
import { ObjectId } from "mongodb";ทำงานให้กับนักเล่น JS
NetOperator Wibby

84

ง่ายยิ่งขึ้นโดยเฉพาะเมื่อเสร็จสิ้นแท็บ:

db.test.find(ObjectId('4ecc05e55dd98a436ddcc47c'))

แก้ไข: ยังทำงานกับfindOneคำสั่งสำหรับเอาต์พุตที่สวยกว่า


ถ้าเราต้องการค้นหาด้วยหลาย ID วัตถุเช่นเดียวกับวิธีที่เราใช้เงื่อนไข WHERE IN ใน mysql
Pratswinz

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด: TypeError: ตัวกรองต้องเป็นอินสแตนซ์ของ dict, bson.son.SON หรือประเภทอื่นที่สืบทอดมาจากการรวบรวมการทำแผนที่
David Okwii

1
@DavidOkwii - ตัวอย่างนี้สำหรับ MongoShell ดูเหมือนว่าคุณกำลังเรียกใช้จาก Python ซึ่งในกรณีนี้คุณต้องการทำเช่น:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard

นี่เป็นความผิดการใช้วิธีการนี้ในdb.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))คำสั่งจะลบเอกสารแม้ว่า ObjectId จะไม่ตรงกับ id ที่ระบุ คุณต้องระบุอย่างแม่นยำdb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie

1
คำถามนี้เป็นเรื่องที่ไม่เกี่ยวกับfind() findOneAndDelete()
MPlanchard

18

คุณพลาดการแทรกเครื่องหมายคำพูดคู่ Query Query คือ

db.theColl.find( { "_id": ObjectId("4ecbe7f9e8c1c9092c000027") } )

"ปัญหาคือฉันไม่ได้ใส่เครื่องหมายคำพูดรอบ _id ของฉัน" - 7 ธันวาคม 2011 ดูความคิดเห็นเกี่ยวกับคำตอบแรก
jcollum

@jcollum เป็นการอัปเดตแบบสอบถามที่คุณใส่ในขณะนี้จะใช้ได้โดยไม่มีเครื่องหมายอัญประกาศรอบ _id
ทดสอบสัตว์

4

หากคุณกำลังทำงานกับเปลือก mongo โปรดอ้างอิงสิ่งนี้: คำตอบจาก Tyler Brock

ฉันเขียนคำตอบถ้าคุณใช้ mongodb โดยใช้ node.js

ObjectIdคุณไม่จำเป็นต้องแปลงรหัสลงใน เพียงใช้:

db.collection.findById('4ecbe7f9e8c1c9092c000027');

วิธีการรวบรวมนี้จะแปลง id เป็น ObjectId โดยอัตโนมัติ

ในทางกลับกัน :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})ไม่ทำงานตามที่คาดไว้ ObjectIdคุณได้แปลงรหัสตนเองลง

สามารถทำได้เช่นนี้

let id = '58c85d1b7932a14c7a0a320d';

let o_id = new ObjectId(id);   // id as a string is passed

db.collection.findOne({"_id":o_id});

findById ควรเป็นฟังก์ชั่น / วิธีการจาก mongoose - ซึ่งมันจะแปลงสตริงภายในเป็น ObjectId เว้นแต่ว่าคุณใช้ mongoose รหัสนี้ไม่ได้ช่วยให้คุณไม่ว่าจะเป็นโหนดหรืออื่น ๆ .. !!
whoami

1
ใช่ .. ฉันลืมที่จะพูดถึงว่าพังพอนเป็นสิ่งจำเป็น ..... ขอบคุณสำหรับการแก้ไข
saurabh gupta

3

ฉันเพิ่งมีปัญหานี้และทำตามที่ระบุไว้ในเอกสารและมันก็ยังไม่ทำงาน

ดูข้อความแสดงข้อผิดพลาดและตรวจสอบให้แน่ใจว่าคุณไม่ได้คัดลอกอักขระพิเศษใด ๆ ฉันได้รับข้อผิดพลาด

SyntaxError: illegal character @(shell):1:43

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

ฉันทำการพัฒนาใน WebMatrix และคัดลอก id วัตถุจากคอนโซล เมื่อใดก็ตามที่คุณคัดลอกจากคอนโซลใน WebMatrix คุณมีโอกาสหยิบตัวละครที่มองไม่เห็นซึ่งจะทำให้เกิดข้อผิดพลาด


3

เมื่อคุณเปิด mongo CLI ให้เชื่อมต่อและอนุญาตในฐานข้อมูลที่ถูกต้อง

ตัวอย่างต่อไปนี้แสดงวิธีค้นหาเอกสารด้วย _id = 568c28fffc4be30d44d0398e จากคอลเล็กชันที่เรียกว่า“ ผลิตภัณฑ์”:

db.products.find({"_id": ObjectId("568c28fffc4be30d44d0398e")})

2

ในฟังก์ชั่น MongoDB Stitch สามารถทำได้โดยใช้BSONดังนี้

ใช้ObjectIdผู้ช่วยเหลือในแพ็คเกจยูทิลิตี้ BSON เพื่อจุดประสงค์นี้เช่นในตัวอย่าง follwing:

var id = "5bb9e9f84186b222c8901149";  
BSON.ObjectId(id);

1

ฉันคิดว่าคุณควรเขียนสิ่งนี้:

db.getCollection('Blog').find({"_id":ObjectId("58f6724e97990e9de4f17c23")})

คุณช่วยอธิบายได้เล็กน้อยว่ารหัสนี้ตอบคำถามได้อย่างไร
ḞḹáḿíṅḡⱫỏḿƀíé

-1

ในการใช้วิธี Objectid คุณไม่จำเป็นต้องนำเข้า มันมีอยู่บนวัตถุ mongodb แล้ว

var ObjectId = new db.ObjectId('58c85d1b7932a14c7a0a320d');
db.yourCollection.findOne({ _id: ObjectId }, function (err, info) {
   console.log(info)
});
               


1
Nope:TypeError: db.ObjectId is not a function
jorisw

มันเป็นแค่ObjectId("SOMETHING")
เบ็นซินแคลร์

-1

หากคุณใช้ Node.js:

ใน req.user นั้นเป็นรูปแบบ ObjectId

var mongoose = require("mongoose");
var ObjectId = mongoose.Schema.Types.ObjectId;

function getUsers(req, res)
    User.findOne({"_id":req.user}, { password: 0 }) 
         .then(data => { 
             res.send(data);})g
}
exports.getUsers = getUsers;

-5

เพียงทำ:

db.getCollection('test').find('4ecbe7f9e8c1c9092c000027');

สิ่งนี้ใช้ไม่ได้สำหรับฉันจากMongo Shellเวอร์ชัน 3.2.7
Amio.io

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