MongoDBコレクションのすべてのドキュメントに対して単一のフィールドを選択するにはどうすればよいですか?


223

私のMongoDBには、フィールドnameとを含む10レコードの学生コレクションがありrollます。このコレクションの1つのレコードは次のとおりです。

{
    "_id" : ObjectId("53d9feff55d6b4dd1171dd9e"),
    "name" : "Swati",
    "roll" : "80",
}

roll従来のデータベースと同じように、コレクション内の10レコードすべてのフィールドのみを取得するには、次のようにします。

SELECT roll FROM student

私は多くのブログを調査しましたが、すべてに、WHERE句が含まれている必要があるクエリが作成されています。次に例を示します。

db.students.find({ "roll": { $gt: 70 })

クエリは次と同等です。

SELECT * FROM student WHERE roll > 70

私の要件は、条件なしで単一のキーのみを見つけることです。それで、そのためのクエリ操作は何ですか?


@NeilLunn SQL to MongoDB Mappingへのリンクをありがとう。どうやってこれを逃したかわからない。
シプラスワティ2014

回答:


255

MongoDBドキュメントから:

プロジェクションには、いくつかのフィールドを明示的に含めることができます。次の操作では、find()メソッドはクエリに一致するすべてのドキュメントを返します。結果セットでは、itemフィールドとqtyフィールド、デフォルトでは_idフィールドのみが一致するドキュメントで返されます。

db.inventory.find({type: 'food'}、{item:1、qty:1})

モンゴの人々からこの例では、返されたドキュメントは、のフィールドのみが含まれますitemqty_id


したがって、次のようなステートメントを発行できるはずです。

db.student.find({}, {roll:1, _id:0})

上記のステートメントは、studentsコレクション内のすべてのドキュメントを選択し、返されたドキュメントはrollフィールドのみを返します(およびを除外します_id)。

言及しない場合_id:0、返されるフィールドはrollおよびになり_idます。「_id」フィールドは常にデフォルトで表示されます。したがって、_id:0とともに明示的に言及する必要がありrollます。


9
これはグーグルには思えないので、一見の価値があります。不要なすべてのフィールドを明示的に除外する必要がありますか?必要なフィールドは1つだけですが、ドキュメントには10​​個0あり、そのうちの9個を明示的に設定する必要があるとします。編集:ネヴァーマインドは、除く_idつまりは{field_I_want:1, _id:0}仕事に思える
カールTryggvason

プロジェクションを使用している場合、フィールドを追加してからドキュメントを更新することはできますか?
2016

3
回答のいずれにも実際には次のWith the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.ことは含まれていません。注:これは一部のユーザーにとって興味深いかもしれません。(ソース
user0800

137

テーブルからすべてのデータを取得する

db.student.find({})

生徒から選択*


_idなしでテーブルからすべてのデータを取得する

db.student.find({}, {_id:0})

名前を選択し、学生から転載


_idを持つ1つのフィールドからすべてのデータを取得する

db.student.find({}, {roll:1})

IDを選択して、学生からロール


_idなしで1つのフィールドからすべてのデータを取得する

db.student.find({}, {roll:1, _id:0})

生徒からロールを選択


where句を使用して指定されたデータを検索する

db.student.find({roll: 80})

SELECT * FROM WHERE WHERE roll = '80'


where句とより大きい条件を使用してデータを検索する

db.student.find({ "roll": { $gt: 70 }}) // $gt is greater than 

SELECT * FROM WHERE WHERE roll> '70'


where句を使用し、条件以上のデータを検索する

db.student.find({ "roll": { $gte: 70 }}) // $gte is greater than or equal

SELECT * FROM student WHERE roll> = '70'


where句を使用し、条件以下のデータを検索する

db.student.find({ "roll": { $lte: 70 }}) // $lte is less than or equal

SELECT * FROM学生WHEREロール<= '70'


where句を使用して、条件よりも小さいデータを検索する

db.student.find({ "roll": { $lt: 70 }})  // $lt is less than

SELECT * FROM WHERE WHERE roll <'70'



2
追加したいのは、あなたの答えが私の解決策を理解するのに役立ちましたので、_id 以外のすべてのプロパティ表示することdb.student.find({}, {_id:0})は、助けてくれてありがとうです。
user8675309

58

私はmattingly890が正しい答えを持っていると思います、これはパターン/コマンドとともに別の例です

db.collection.find( {}, {your_key:1, _id:0})

ここに画像の説明を入力してください


mongoからの出力と、例として返す内容を表示します。
グリピット

私は私の答えにスクリーンショットを含めていたので、あなたは私に反対票を投じましたか?
グリピット

はい、そしてあなたの答えが@therealrootuserの返答から何をもたらすのか私にはわからないので
Guillaume Lebreton

10

さあ始めましょう。3つの方法、退屈するまでの時間:

db.student.find({}, 'roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}).select('roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}, {'roll' : 1 , '_id' : 1 ); // <---- Old lengthy boring way

特定のフィールドを削除するには、-演算子を使用します。

db.student.find({}).select('roll -_id') // <--- Will remove id from result

1
あなたの言及されたコマンドはマングースからのものであり、3つ目を除いてmongodbではないと思います。
アシシュヤン

8

単に教育目的のために、次のいずれかの方法でそれを行うこともできます:

1。

    var query = {"roll": {$gt: 70};
    var cursor = db.student.find(query);
    cursor.project({"roll":1, "_id":0});

2。

    var query = {"roll": {$gt: 70};
    var projection = {"roll":1, "_id":0};
    var cursor = db.student.find(query,projection);

`


8

次のクエリを試してください。

db.student.find({}, {roll: 1, _id: 0}).pretty();

お役に立てれば!!


pretty()は、スクリプトからではなく、シェルを介して実行する場合にのみ役立ちます。
Dinakar、

7
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

あなたの例では、次のようなことができます:

db.students.find({}, {"roll":true, "_id":false})

投影

射影パラメータは、一致するドキュメントで返されるフィールドを決定します。射影パラメータは、次の形式のドキュメントを取ります。

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1またはtrueは、フィールドを返品ドキュメントに含めます。

  2. フィールドを除外するには、0またはfalse。

注意

_idフィールドの場合、_id:1を明示的に指定して_idフィールドを返す必要はありません。フィールドを抑制するために_id:0を指定しない限り、find()メソッドは常に_idフィールドを返します。

続きを読む


7

一方でgowthamの答えが完了すると、それはこれらのコマンドは、(モンゴのシェルを使用していない人のため)API上から別のものに異なる可能性があることは注目に値します。
詳細については、ドキュメントのリンクを参照してください。

たとえばNodejsには、投影するためにfind関数に追加する「projection」というメソッドがあります。

同じ例のセットに従って、次のようなコマンドをノードで使用できます。

db.student.find({}).project({roll:1})

SELECT _id、学生からのロール

または
db.student.find({}).project({roll:1, _id: 0})

生徒からロールを選択

等々。

nodejsユーザーの場合もtoArray.thenコマンドを追加するために使用することを忘れないでください(以前にこのAPIを使用したことがあれば、すでに知っているはずです)を使用してください。


4

よりよく理解するために、同様のMySQLクエリを記述しました。

Selecting specific fields 

MongoDB: db.collection_name.find({}、{name:true、email:true、phone:true});

MySQL: SELECT name、email、phone FROM table_name;

Selecting specific fields with where clause

MongoDB: db.collection_name.find({email:'you@email.com '}、{name:true、email:true、phone:true});

MySQL: SELECT name、email、phone FROM table_name WHERE email = 'you@email.com';


3

これは私にとってはうまくいきます

db.student.find({},{"roll":1})

where句に条件がない、つまり最初の中括弧の内側。次の中括弧内:結果に必要な投影フィールド名のリスト、1は特定のフィールドがクエリ結果の一部であることを示します


2

学生の名前を取得

student-details = db.students.find({{ "roll": {$gt: 70} },{"name": 1, "_id": False})

生徒の名前とロールを取得

student-details = db.students.find({{ "roll": {$gt: 70}},{"name": 1,"roll":1,"_id": False})

2

MongoDBのクエリの料金はここにあり、説明はフィールドです。

db.getCollection('fees').find({},{description:1,_id:0})

1

コレクション内のすべての10レコードについてのみ「ロール」フィールドを取得したい場合。次にこれを試してください。

MongoDbの場合:

db.students.find({}、{"ロール":{"$ロール"})

SQLでは:

学生からロールを選択


1

別のオブジェクトにネストされているフィールドを表示する場合は、次の構文を使用できることを回答に追加します

db.collection.find( {}, {{'object.key': true}})

ここで、キーはオブジェクトという名前のオブジェクト内にあります

{ "_id" : ObjectId("5d2ef0702385"), "object" : { "key" : "value" } }

0
db.student.find({}, {"roll":1, "_id":0})

これは-と同等です

学生からロールを選択



db.student.find({}、{"roll":1、 "name":1、 "_id":0})

これは-と同等です

学生からロール、名前を選択


0

シェルで次のようなクエリを使用します。

1.使用database_name

e.g: use database_name

2.一致したときにアセットの特定のフィールド情報のみを返す_id:0、結果にIDを表示しないことを指定します

db.collection_name.find( { "Search_Field": "value" }, 
                  { "Field_to_display": 1,_id:0 }  )

0

mongodb 3.4では、以下のロジックを使用できますが、以前のバージョンについてはわかりません

学生からロールを選択==> db.student.find(!{}、{roll:1})

上記のロジックは、いくつかの列を定義するのに役立ちます(少ない場合)


0

MongoDBにStudio 3Tを使用し.find({}, { _id: 0, roll: true })ていますが、それを使用しても、空の_idプロパティを持つオブジェクトの配列が返されます。

JavaScript mapを使用すると、目的のrollプロパティを文字列の配列として取得するだけで済みます。

var rolls = db.student
  .find({ roll: { $gt: 70 } }) // query where role > 70
  .map(x => x.roll);           // return an array of role

0

これで質問の答えがわかりませんが、ここで言及する価値があると思います。を使用して(複数ではなく)単一のフィールドを選択するもう1つの方法がありますdb.collection_name.distinct();

例えば、db.student.distinct('roll',{});

または、2番目の方法:使用 db.collection_name.find().forEach();(ここでは、連結によって複数のフィールドを選択できます)

例えば、 db.collection_name.find().forEach(function(c1){print(c1.roll);});

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.