2011-11-22 18 views
149

Tôi đã tìm thấy câu hỏi này được trả lời cho C# và Perl, nhưng không phải trong giao diện gốc. Tôi nghĩ điều này sẽ hoạt động:làm cách nào để tìm kiếm một đối tượng bằng ObjectId của nó trong bảng điều khiển?

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

Truy vấn không trả về kết quả. Tôi đã tìm thấy 4ecbe7f9e8c1c9092c000027 bằng cách thực hiện db.theColl.find() và lấy một ObjectId. Có vài nghìn đối tượng trong bộ sưu tập đó.

Tôi đã đọc tất cả các trang mà tôi có thể tìm thấy trên trang web mongodb.org và không tìm thấy. Đây chỉ là một điều kỳ lạ để làm? Nó có vẻ khá bình thường với tôi.

Trả lời

235

Không lạ chút nào, mọi người làm việc này mọi lúc. Hãy chắc chắn rằng tên bộ sưu tập là chính xác (trường hợp các vấn đề) và ObjectId là chính xác.

Documentation là here

> 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

Strange, tôi khởi động lại giao diện điều khiển của tôi và nó đột nhiên làm việc. Có cách nào để thay đổi "phạm vi" của bạn hoặc một cái gì đó ở dòng lệnh và không thực sự biết nó? – jcollum

+0

Không có thắc mắc: khi tôi tìm kiếm 'tìm ObjectID' trang đó không xuất hiện: http://www.mongodb.org/dosearchsite.action?queryString=find+ObjectId&where=DOCS – jcollum

+0

Vâng, bạn có thể đã vô tình gõ " sử dụng dbname "và chuyển cơ sở dữ liệu. Tôi giả sử bạn không sử dụng nhân bản hoặc sharding, mà rõ ràng sẽ tạo ra các khả năng khác cho lý do tại sao nó không được hiển thị. –

56

Thậm chí dễ dàng hơn, đặc biệt là với hoàn tab:

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

Edit: cũng làm việc với lệnh findOne cho đầu ra đẹp hơn.

+0

nếu chúng tôi muốn tìm kiếm với nhiều Id đối tượng giống như cách chúng tôi triển khai WHERE IN condition in mysql. – Pratswinz

+0

Điều này cho tôi một lỗi: TypeError: bộ lọc phải là một thể hiện của dict, bson.son.SON, hoặc loại khác được thừa hưởng từ collection.Mapping –

+1

@DavidOkwii - ví dụ này là dành cho MongoShell. Dường như bạn đang chạy từ Python, trong trường hợp đó bạn sẽ muốn làm một cái gì đó như: 'db.test.find ({'_ id': ObjectId ('4ecc05e55dd98a436ddcc47c')})' – MPlanchard

10

Bạn đã bỏ lỡ chèn Dấu ngoặc kép. Các truy vấn chính xác là

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

"Vấn đề là tôi đã được không đặt dấu ngoặc kép quanh _id của tôi. " - Ngày 07 tháng 12 năm 2011, xem các ý kiến ​​về câu trả lời đầu tiên – jcollum

+0

@jcollum Là một bản cập nhật, truy vấn bạn đặt bây giờ sẽ hợp lệ mà không có dấu ngoặc kép quanh _id. – AnimalTesting

43

Nếu bạn đang sử dụng 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}) 

Edit: sửa chữa để ObjectId mới (id), không phải là mới ObjectId (id)

+1

đã phải chịu đựng điều này! tx –

-3

Đơn giản chỉ cần làm :

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

Điều này không phù hợp với tôi từ phiên bản 'Mongo Shell' 3.2.7. – zatziky

+0

Điều đó sẽ chỉ khớp với _id là một chuỗi; nếu nó là một ObjectId đúng, bạn cần phải tìm kiếm bằng cách sử dụng cú pháp ObjectId. –

2

Tôi vừa gặp sự cố này và đang thực hiện chính xác như đã được ghi lại và vẫn không hoạt động.

Nhìn vào thông báo lỗi của bạn và chắc chắn rằng bạn không có bất kỳ ký tự đặc biệt sao chép. Tôi đã nhận được lỗi

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

Khi tôi đến nhân vật 43 nó chỉ là sự bắt đầu của ID đối tượng của tôi, sau khi các dấu ngoặc kép mở, chính xác như tôi dán nó vào. Tôi đặt con trỏ của tôi ở đó và nhấn backspace không có gì xuất hiện để xảy ra khi nó nên đã loại bỏ các báo giá mở. Tôi nhấn backspace một lần nữa và nó loại bỏ các báo giá mở, sau đó tôi đặt báo giá trở lại và thực hiện các truy vấn và nó đã làm việc, mặc dù nhìn chính xác như nhau.

Tôi đã phát triển trong WebMatrix và sao chép id đối tượng từ bảng điều khiển. Bất cứ khi nào bạn sao chép từ giao diện điều khiển trong WebMatrix, bạn có thể chọn một số ký tự vô hình sẽ gây ra lỗi.

3

Sau khi bạn mở CLI mongo, đã kết nối và được ủy quyền trên cơ sở dữ liệu bên phải.

The following example shows how to find the document with the _id=568c28fffc4be30d44d0398e from a collection called “products”:

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

Tôi nghĩ rằng bạn tốt hơn viết một cái gì đó như thế này:

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

Bạn có thể giải thích một chút về cách mã này trả lời câu hỏi không? –

0

Để sử dụng phương pháp ObjectId bạn không cần phải nhập khẩu nó. Nó đã có trên đối tượng mongodb.

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

+1

Không: 'LoạiError: db.ObjectId không phải là hàm' – jorisw

+0

Nó chỉ là' ObjectId ("SOMETHING") ' – Andy

Các vấn đề liên quan