mongoコンソールでObjectIdを使用してオブジェクトを検索するにはどうすればよいですか?


265

私はこの質問がC#とPerlで回答されているのを見つけましたが、ネイティブインターフェイスでは見つかりませんでした。私はこれがうまくいくと思った:

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

クエリは結果を返しませんでした。db.theColl.find()ObjectIdを実行して取得することにより、4ecbe7f9e8c1c9092c000027を見つけました。そのコレクションには数千のオブジェクトがあります。

mongodb.orgのWebサイトで見つけたすべてのページを読みましたが、見つかりませんでした。これは奇妙なことですか?それは私にはかなり普通のようです。

回答:


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
ええ、「use dbname」と誤って入力してデータベースを切り替えた可能性があります。私はあなたがレプリケーションまたはシャーディングを使用していないことを前提としています。これは明らかに、それが表示されなかった理由の他の可能性を生み出すでしょう。
タイラーブロック

1
問題は、_idを引用符で囲んでいないことでした。
jcollum

9
うわー、これがMongoDBの特別な何かであるとは思いもしませんでした。私の問題が別の場所にあると考えて少し時間を無駄にしましたが、それを見つけるには追加のルールが必要でした。expressとnodeを使用する人にとって価値のあるものには、ObjectId exp ...が必要です。var ObjectId = require( 'mongodb')。ObjectID;
Chris Hawkes、2015

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 2018

84

特にタブ補完を使用すると、さらに簡単になります。

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

編集:findOneよりきれいな出力のためのコマンドでも動作します。


MySQLでWHERE IN条件を実装するのと同じように、複数のオブジェクトIDで検索したい場合。
Pratswinz、2016年

collections.Mappingからフィルタがあることのdict、bson.son.SON、または他の型のインスタンスでなければなりません継承:例外TypeError:これは私にエラー与えます
デヴィッド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 2018

18

二重引用符を挿入するのに失敗しました。完全一致クエリは

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

「問題は、_idを引用符で囲んでいないことでした。」-2011年12月7日、最初の回答のコメントを参照
jcollum

@jcollum更新として、ここで入力したクエリは、_idを囲む引用符なしで有効になります。
AnimalTesting 2016

4

mongoシェルで作業している場合は、これを参照してください:Tyler Brockからの回答

node.jsを使用してmongodbを使用している場合、私は答えを書きました

IDをに変換する必要はありませんObjectId。ただ使用する:

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

このコレクションメソッドは、IDをObjectIdに自動的に変換します。

一方 :

db.collection.findOne({"_id":'4ecbe7f9e8c1c9092c000027'})期待どおりに動作しません。idを手動でに変換しましたObjectId

それはこのように行うことができます:

let id = '58c85d1b7932a14c7a0a320d';

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

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

findByIdは、mongooseからの関数/メソッドである必要があります。mongooseを使用しない限り、内部的に文字列をObjectIdに変換します。このコードは、ノードかどうかに関係なく役立ちます。
whoami

1
はい..マングースが必要であることを言及するのを忘れていました.....訂正ありがとうございました
saurabh gupta

3

私はこの問題を抱えていて、文書化されているとおりに実行していましたが、まだ機能していませんでした。

エラーメッセージを見て、特殊文字がコピーされていないことを確認してください。エラーが発生しました

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

文字43に行ったとき、それは貼り付けたとおりに、開いた引用符の後の私のオブジェクトIDの始まりにすぎませんでした。カーソルをそこに置いてバックスペースを押したところ、開いた引用符を削除する必要があるときに何も起こりませんでした。私はもう一度バックスペースを押して、開いている引用を削除し、次に引用を元に戻し、クエリを実行しましたが、まったく同じに見えましたが、機能しました。

WebMatrixで開発を行っていて、コンソールからオブジェクトIDをコピーしました。WebMatrixのコンソールからコピーするときはいつでも、エラーの原因となるいくつかの非表示の文字を取得する可能性があります。


3

mongo CLIを開くと、適切なデータベースで接続および承認されます。

次の例は、_productsというコレクションから、_id = 568c28fffc4be30d44d0398eのドキュメント見つける方法を示しています

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

2

MongoDB Stitch関数では、以下のようなBSONを使用して実行できます。

次のObjectId例のように、この目的のためにBSONユーティリティパッケージのヘルパーを使用します。

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
いいえ:TypeError: db.ObjectId is not a function
jorisw 2017

それだけです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.