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 mongo?


265

Tôi đã tìm thấy câu hỏi này trả lời cho C # và Perl, nhưng không có trong giao diện gốc. Tôi nghĩ rằng điều này sẽ làm việc:

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

Các truy vấn trả về không có 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 ngà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 nó. Đây chỉ là một điều kỳ lạ để làm? Nó có vẻ khá bình thường với tôi.

Câu trả lời:


417

Không có gì lạ cả, mọi người làm điều này mọi lúc. Đảm bảo tên bộ sưu tập là chính xác (trường hợp quan trọng) và ObjectId là chính xác.

Tài liệu ở đây

> 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
Lạ thay, tôi khởi động lại bàn điều khiển của mình và nó đột nhiên hoạt động. 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

Không có gì lạ: khi tôi tìm kiếm 'tìm ObjectID', trang đó không xuất hiện: mongodb.org/iêu
jcollum

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

1
Vấn đề là tôi đã không đặt dấu ngoặc kép quanh _id của mình.
jcollum

9
Ồ, tôi không biết đây là một điều đặc biệt trong MongoDB đã lãng phí một chút thời gian để nghĩ rằng vấn đề của tôi ở nơi khác, nhưng việc tìm kiếm nó chỉ cần các quy tắc bổ sung. đối với những gì đáng để mọi người sử dụng express và nút sẽ cần phải yêu cầu ObjectId exp ... var ObjectId = quiries ('mongodb'). ObjectID;
Chris Hawkes

87

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

Chỉnh sửa: đã sửa thành ObjectId mới (id), không phải ObjectID (id) mới


5
import { ObjectId } from "mongodb";làm việc cho fancier JS.
NetOperator Wibby

84

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

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

Chỉnh sửa: cũng hoạt động với findOnelệnh cho đầu ra đẹp hơn.


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

Điều này sẽ cho tôi một lỗi: Lỗi Loại: bộ lọc phải là một thể hiện của dict, bson.son.SON, hoặc loại khác mà thừa hưởng từ collections.Mapping
David Okwii

1
@DavidOkwii - ví dụ này dành cho MongoShell. Có vẻ 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 22/03/2017

Điều này là sai, sử dụng phương pháp này trong một db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))lệnh sẽ xóa tài liệu ngay cả khi ObjectId không khớp với id đã chỉ định. Bạn cần xác định chính xác như thế nàydb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie

1
Câu hỏi này là về find(), không phải về findOneAndDelete().
MPlanchard

18

Bạn đã bỏ lỡ để chèn Báo giá kép. Truy vấn chính xác là

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

"Vấn đề là tôi đã không đặt dấu ngoặc kép quanh _id của mình." - Ngày 7 tháng 12 năm 2011, xem các bình luận về câu trả lời đầu tiên
jcollum

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

4

Nếu bạn đang làm việc trên vỏ mongo, vui lòng tham khảo điều này: Trả lời từ Tyler Brock

Tôi đã viết câu trả lời nếu bạn đang sử dụng mongodb bằng node.js

Bạn không cần phải chuyển đổi id thành một ObjectId. Chỉ dùng :

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

phương thức thu thập này sẽ tự động chuyển đổi id thành ObjectId.

Mặt khác :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})không làm việc như mong đợi. Bạn đã tự chuyển đổi id thành ObjectId.

Điều đó có thể được thực hiện như thế này:

let id = '58c85d1b7932a14c7a0a320d';

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

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

findById phải là một hàm / phương thức từ mongoose - nơi nó chuyển đổi bên trong chuỗi thành ObjectId, trừ khi bạn sử dụng mongoose, mã này không giúp bạn cho dù đó là nút hay khác .. !!
whoami

1
vâng..tôi quên đề cập rằng cầy mangut là bắt buộc ..... cảm ơn bạn đã sửa chữa
saurabh gupta

3

Tôi chỉ gặp vấn đề này và đã làm đúng như tài liệu và nó vẫn không hoạt động.

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

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

Khi tôi đi đến ký tự 43, đó chỉ là khởi đầu của ID đối tượng của tôi, sau 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 mình ở đó và nhấn backspace không có gì xảy ra khi nó nên xóa trích dẫn mở. Tôi nhấn backspace một lần nữa và nó loại bỏ trích dẫn mở, sau đó tôi đặt lại trích dẫn và thực hiện truy vấn và nó hoạt động, mặc dù trông giống hệt nhau.

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


3

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

Ví dụ sau đây cho thấy cách tìm tài liệu với _id = 568c28fffc4be30d44d0398e từ một bộ sưu tập có tên là sản phẩm của Drake.

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

2

Trong các hàm MongoDB Stitch, nó có thể được thực hiện bằng BSON như dưới đây:

Sử dụng trình ObjectIdtrợ giúp trong gói tiện ích BSON cho mục đích này như trong ví dụ follwing:

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

1

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

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

Bạn có thể giải thích một chút làm thế nào mã này trả lời câu hỏi?
Ḟḹáḿíṅḡ Ⱬỏḿƀíé

-1

Để sử dụng phương pháp Objectid, bạn không cần nhập 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:TypeError: db.ObjectId is not a function
jorisw

Chỉ làObjectId("SOMETHING")
Ben Sinclair

-1

Nếu bạn đang sử dụng Node.js:

Trong đó req.user là định dạng 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

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

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

Điều này không hoạt động đối với tôi từ Mongo Shellphiên bản 3.2.7.
Amio.io

1
Điều đó sẽ chỉ phù hợp với một _id là một chuỗi; nếu đó là một ObjectId thực sự, bạn cần tìm kiếm bằng cú pháp ObjectId.
Vince Bowdren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.