Bagaimana cara mencari objek dengan ObjectId di konsol mongo?


265

Saya menemukan pertanyaan ini dijawab untuk C # dan Perl, tetapi tidak di antarmuka asli. Saya pikir ini akan berhasil:

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

Permintaan tidak mengembalikan hasil. Saya menemukan 4ecbe7f9e8c1c9092c000027 dengan melakukan db.theColl.find()dan meraih ObjectId. Ada beberapa ribu objek dalam koleksi itu.

Saya telah membaca semua halaman yang dapat saya temukan di situs web mongodb.org dan tidak menemukannya. Apakah ini hal yang aneh untuk dilakukan? Sepertinya cukup normal bagi saya.

Jawaban:


417

Tidak aneh sama sekali, orang melakukan ini sepanjang waktu. Pastikan nama koleksi sudah benar (hal penting) dan ObjectId tepat.

Dokumentasi ada di sini

> 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
Aneh, saya me-restart konsol saya dan tiba-tiba berhasil. Apakah ada cara untuk mengubah "ruang lingkup" Anda atau sesuatu di baris perintah dan tidak benar-benar mengetahuinya?
jcollum

Tidak heran: ketika saya mencari 'find ObjectID' halaman itu tidak muncul: mongodb.org/…
jcollum

1
Ya, Anda mungkin secara tidak sengaja mengetik "use dbname" dan mengganti database. Saya berasumsi Anda tidak menggunakan replikasi atau sharding, yang jelas akan menciptakan kemungkinan lain mengapa itu tidak muncul.
Tyler Brock

1
Masalahnya adalah saya tidak menaruh tanda kutip di _id saya.
jcollum

9
Wow, saya tidak tahu ini adalah sesuatu yang istimewa di MongoDB membuang-buang waktu berpikir masalah saya ada di tempat lain, tetapi menemukan itu hanya memerlukan aturan tambahan. untuk apa layaknya orang menggunakan express dan node perlu membutuhkan ObjectId exp ... var ObjectId = require ('mongodb'). ObjectID;
Chris Hawkes

87

Jika Anda menggunakan 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: dikoreksi ke ObjectId (id) baru, bukan ObjectID (id) baru


5
import { ObjectId } from "mongodb";bekerja untuk JS pelamun.
NetOperator Wibby

84

Lebih mudah, terutama dengan penyelesaian tab:

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

Sunting: juga berfungsi dengan findOneperintah untuk hasil yang lebih cantik.


jika kita ingin mencari dengan beberapa objek Id seperti cara kita menerapkan kondisi WHERE IN di mysql.
Pratswinz

Ini memberi saya kesalahan: TypeError: filter harus merupakan instance dari dict, bson.son.SON, atau tipe lain yang mewarisi dari koleksi.
Pemetaan

1
@ Davidvidkwii - contoh ini untuk MongoShell. Sepertinya Anda menjalankan dari Python, dalam hal ini Anda ingin melakukan sesuatu seperti:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard

Ini salah, menggunakan pendekatan ini dalam db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))perintah akan menghapus dokumen bahkan jika ObjectId tidak cocok dengan id yang ditentukan. Anda harus menentukan secara tepat seperti inidb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie

1
Pertanyaan ini tentang find(), bukan tentang findOneAndDelete().
MPlanchard

18

Anda Telah melewatkan memasukkan Kutipan Ganda. Permintaan Tepat adalah

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

"Masalahnya adalah saya tidak menaruh tanda kutip pada _id saya." - 7 Des 2011, lihat komentar pada jawaban pertama
jcollum

@ jcollum Sebagai pembaruan, kueri yang Anda masukkan sekarang akan valid tanpa tanda kutip di sekitar _id.
AnimalTesting

4

Jika Anda sedang mengerjakan shell mongo, Silakan lihat ini: Jawaban dari Tyler Brock

Saya menulis jawabannya jika Anda menggunakan mongodb menggunakan node.js

Anda tidak perlu mengonversi id menjadi ObjectId. Cukup gunakan:

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

metode pengumpulan ini akan secara otomatis mengubah id menjadi ObjectId.

Di samping itu :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})tidak berfungsi seperti yang diharapkan. Anda secara manual mengubah id menjadi ObjectId.

Itu bisa dilakukan seperti ini:

let id = '58c85d1b7932a14c7a0a320d';

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

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

findById harus berupa fungsi / metode dari luwak - di mana ia secara internal mengubah string ke ObjectId, kecuali jika Anda menggunakan luwak, kode ini tidak membantu Anda apakah itu simpul atau lainnya .. !!
whoami

1
ya..saya lupa menyebutkan bahwa luwak diperlukan ..... terima kasih atas koreksi
saurabh gupta

3

Saya baru saja mengalami masalah ini dan melakukan persis seperti yang telah didokumentasikan dan masih tidak berfungsi.

Lihatlah pesan kesalahan Anda dan pastikan Anda tidak memiliki karakter khusus yang disalin. Saya mendapat kesalahan

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

Ketika saya pergi ke karakter 43 itu hanya permulaan dari ID objek saya, setelah tanda kutip terbuka, persis ketika saya menempelkannya. Saya meletakkan kursor saya di sana dan menekan backspace sepertinya tidak terjadi apa-apa ketika itu seharusnya menghilangkan kutipan terbuka. Saya menekan backspace lagi dan menghapus kuotasi terbuka, kemudian saya memasukkan kuotasi kembali dan mengeksekusi kueri dan berhasil, meskipun tampak persis sama.

Saya melakukan pengembangan di WebMatrix dan menyalin id objek dari konsol. Setiap kali Anda menyalin dari konsol di WebMatrix Anda cenderung mengambil beberapa karakter yang tidak terlihat yang akan menyebabkan kesalahan.


3

Setelah Anda membuka mongo CLI, terhubung dan disahkan pada database yang tepat.

Contoh berikut menunjukkan cara menemukan dokumen dengan _id = 568c28fffc4be30d44d0398e dari koleksi yang disebut "produk":

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

2

Dalam fungsi MongoDB Stitch dapat dilakukan menggunakan BSON seperti di bawah ini:

Gunakan ObjectIdhelper dalam paket utilitas BSON untuk tujuan ini seperti dalam contoh berikut:

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


-1

Untuk menggunakan metode Objectid, Anda tidak perlu mengimpornya. Sudah ada di objek mongodb.

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


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

Hanya sajaObjectId("SOMETHING")
Ben Sinclair

-1

Jika Anda menggunakan Node.js:

Dalam req.user itu adalah format 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

Cukup lakukan:

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

Ini tidak berfungsi untuk saya dari Mongo Shellversi 3.2.7.
Amio.io

1
Itu hanya akan cocok dengan _id yang merupakan string; jika itu benar ObjectId, Anda perlu mencari menggunakan sintaks ObjectId.
Vince Bowdren
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.