Moğol konsolundaki bir nesnesini ObjectId ile nasıl arayabilirim?


265

Bu soruyu C # ve Perl için cevapladım, ancak yerel arayüzde bulamadım. Bunun işe yarayacağını düşündüm:

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

Sorgu hiçbir sonuç döndürmedi. 4ecbe7f9e8c1c9092c000027 db.theColl.find()bir ObjectId yaparak ve yakalayarak buldum. Bu koleksiyonda birkaç bin nesne var.

Mongodb.org web sitesinde bulabildiğim tüm sayfaları okudum ve bulamadım. Bu sadece garip bir şey mi? Bana çok normal geliyor.

Yanıtlar:


417

Hiç garip değil, insanlar bunu her zaman yapıyor. Koleksiyon adının doğru olduğundan (büyük / küçük harf önemli) ve ObjectId öğesinin tam olduğundan emin olun.

Belgeler burada

> 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
Tuhaf, konsolumu yeniden başlattım ve aniden çalıştı. Komut satırında "kapsamınızı" veya bir şeyi değiştirmenin ve gerçekten bilmemenizin bir yolu var mı?
jcollum


1
Evet, yanlışlıkla "dbname kullan" ve anahtarlamalı veritabanları yazmış olabilirsiniz. Çoğaltma veya parçalama kullanmadığınızı varsayıyorum, bu da neden görünmediğine dair başka olasılıklar yaratacaktır.
Tyler Brock

1
Sorun _idimin etrafına tırnak koymamamdı.
jcollum

9
Vay canına, MongoDB'de özel bir şey olduğuna dair hiçbir fikrim yoktu, sorunumun başka bir yerde olduğunu düşünerek biraz zaman kaybettim, ama bulmak sadece ek kurallar gerektirdi. express ve düğüm kullanan insanlar için ne değer için ObjectId exp gerekir gerekir ... var ObjectId = requir ('mongodb').
Chris Hawkes

87

Node.js kullanıyorsanız:

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

Düzenleme: yeni ObjectID (id) değil, yeni ObjectId (id) olarak düzeltildi


5
import { ObjectId } from "mongodb";meraklısı JS için çalışıyor.
NetOperator Wibby

84

Özellikle sekme tamamlama ile daha da kolay:

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

Edit: ayrıca findOnedaha güzel çıktı komutuyla çalışır .


mysql'de WHERE IN koşulunu uygulama şeklimiz gibi birden çok nesne kimliği ile arama yapmak istiyorsak.
Pratswinz

TypeError: Bu bana bir hata verir filtre dict, bson.son.SON veya başka türde bir örneği olması gerektiğini collections.Mapping devralır
David Okwii

1
@DavidOkwii - bu örnek MongoShell içindir. Görünüşe göre Python'dan kaçıyorsunuz, bu durumda şöyle bir şey yapmak istersiniz:db.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
MPlanchard

Bu yanlıştır, bu yaklaşımı db.test.findOneAndDelete(ObjectId('57eujhs76e7hs877e868'))komutta kullanmak, ObjectId belirtilen kimlikle eşleşmese bile bir belgeyi siler. Tam olarak böyle belirtmeniz gerekiyordb.test.find({'_id': ObjectId('4ecc05e55dd98a436ddcc47c')})
Danny Sofftie

1
Bu soru hakkındaydı find(), hakkında değil findOneAndDelete().
MPlanchard

18

Double Quotes eklemeyi kaçırdınız. Tam Sorgu

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

"Sorun _idimin etrafına alıntı koymamamdı." - 7 Aralık 2011, ilk cevap hakkındaki yorumlara bakın
jcollum

@jcollum Bir güncelleme olarak, şimdi koyduğunuz sorgu _id etrafındaki tırnak işaretleri olmadan geçerli olacaktır.
AnimalTesting

4

Moğol kabuğu üzerinde çalışıyorsanız, lütfen buna bakın: Tyler Brock'dan cevap

Node.js kullanarak mongodb kullanıyorsanız cevabı yazdım

Kimliği bir ObjectId. Sadece kullan :

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

bu toplama yöntemi kimliği otomatik olarak ObjectId'e dönüştürür.

Diğer yandan :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})beklendiği gibi çalışmıyor. Kimliği manuel olarak dönüştürdünüz ObjectId.

Bu şu şekilde yapılabilir:

let id = '58c85d1b7932a14c7a0a320d';

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

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

findById mongoose bir işlev / yöntem olmalıdır - burada mongoose kullanmadığınız sürece dahili olarak dize ObjectId dönüştürür, bu kod düğüm veya diğer olsun size yardımcı olmaz .. !!
whoami

1
Evet .. Firavun faresinin gerekli olduğunu söylemeyi unuttum ..... düzeltme için teşekkür ederim
saurabh gupta

3

Ben sadece bu sorunu vardı ve tam olarak belgelendiği gibi yapıyordum ve hala çalışmıyor.

Hata mesajınıza bakın ve özel karakterlerin kopyalanmadığından emin olun. Hatayı alıyordum

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

43 karakterine gittiğimde, açık tırnaklardan sonra, tam olarak yapıştırdığım gibi, nesne kimliğimin başlangıcıydı. İmlecimi oraya koydum ve geri al tuşuna bastığında, açık alıntıyı kaldırması gerektiğinde hiçbir şey görünmedi. Tekrar geri vurdum ve açık alıntıyı kaldırdım, sonra alıntıyı geri koydum ve sorguyu yürüttüm ve tam olarak aynı görünmesine rağmen çalıştı.

WebMatrix'te geliştirme yapıyordum ve nesne kimliğini konsoldan kopyaladım. WebMatrix'teki konsoldan her kopyaladığınızda, hatalara neden olacak bazı görünmez karakterler alacaksınız.


3

Mongo CLI'yi açtıktan sonra, doğru veritabanına bağlanır ve yetkilendirilir.

Aşağıdaki örnekte, "ürünler" adlı bir koleksiyonda _id = 568c28fffc4be30d44d0398e içeren belgenin nasıl bulunacağı gösterilmektedir :

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

2

MongoDB Stitch fonksiyonlarında aşağıdaki gibi BSON kullanılarak yapılabilir :

ObjectIdAşağıdaki amaç için olduğu gibi BSON yardımcı program paketindeki yardımcıyı kullanın :

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


-1

Objectid yöntemini kullanmak için içe aktarmanıza gerek yoktur. Zaten mongodb nesnesinde.

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


1
Hayır:TypeError: db.ObjectId is not a function
jorisw

SadeceObjectId("SOMETHING")
Ben Sinclair

-1

Node.js kullanıyorsanız:

Bu req.user ObjectId biçimindedir.

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

Basitçe yapın:

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

Bu benim için Mongo Shell3.2.7 sürümünden işe yaramıyor .
Amio.io

1
Bu yalnızca bir dize olan _id ile eşleşir; gerçek bir ObjectId ise, ObjectId sözdizimini kullanarak arama yapmanız gerekir.
Vince Bowdren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.