如何为MongoDB集合中的所有文档选择单个字段?

时间:2014-08-31 05:04:51

标签: mongodb projection

在我的MongoDB中,我有一个包含10条记录的学生集合,其中包含字段nameroll。该系列的一个记录是:

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

我希望仅对集合中的所有10条记录检索字段roll,就像我们在传统数据库中使用:

一样
SELECT roll FROM student

我浏览了很多博客,但都产生了一个查询,其中必须包含WHERE子句,例如:

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

该查询相当于:

SELECT * FROM student WHERE roll > 70

我的要求是只在没有任何条件的情况下找到一个单独的密钥。那么,查询操作是什么。

22 个答案:

答案 0 :(得分:191)

来自MongoDB docs

  

投影可以明确包含多个字段。在以下操作中,find()方法返回与查询匹配的所有文档。在结果集中,只有item和qty字段,默认情况下,_id字段在匹配的文档中返回。

     

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

在来自Mongo的人的这个示例中,返回的文档将仅包含itemqty_id的字段。


因此,您应该能够发出如下声明:

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

上述语句将选择学生集合中的所有文档,返回的文档将仅返回roll字段(并排除_id)。

如果我们不提及_id:0,则返回的字段将为roll_id。 ' _id'默认情况下始终显示字段。因此,我们需要明确提及_id:0以及roll

答案 1 :(得分:53)

从表中获取所有数据而不使用_id

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

SELECT * FROM student

使用_id

从一个字段获取所有数据
db.student.find({}, {roll:1})
  

SELECT roll FROM student

从一个字段获取所有数据而不使用_id

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

使用where子句

查找指定数据
db.student.find({roll: 80})
  

SELECT * FROM学生WHERE roll = '80'

使用where子句并且大于条件

查找数据
db.student.find({ "roll": { $gt: 70 }})
  

SELECT * FROM student WHERE roll> '70'

使用where子句查找数据且小于或等于条件

db.student.find({ "roll": { $lte: 70 }})
  

SELECT * FROM student WHERE roll< ='70'

使用where子句查找数据,少于条件

db.student.find({ "roll": { $lt: 70 }})
  

SELECT * FROM student WHERE roll< '70'

答案 2 :(得分:51)

我认为mattingly890有正确答案,这是另一个例子以及模式/命令

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

enter image description here

答案 3 :(得分:5)

尝试以下查询:

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

希望这会有所帮助!!

答案 4 :(得分:4)

出于教育目的,您也可以通过以下任何方式进行操作:

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

`

答案 5 :(得分:3)

这对我有用,

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

where子句中没有条件,即在第一个花括号内。 在下一个花括号内:结果中需要的投影字段名​​称列表,1表示特定字段是查询结果的一部分

答案 6 :(得分:2)

为了更好地理解,我编写了类似的MySQL查询。

Selecting specific fields 
  

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

     

MySQL::选择名称,电子邮件,电话FROM表名;

Selecting specific fields with where clause
  

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

     

MySQL::选择名称,电子邮件,电话,来自table_name WHERE email ='you@email.com';

答案 7 :(得分:2)

 var collection = db.collection('appuser');
    collection.aggregate(
      { $project : { firstName : 1, lastName : 1 } },function(err, res){
        res.toArray(function(err, realRes){
          console.log("response roo==>",realRes);
        });
      });  
  • 工作正常

答案 8 :(得分:2)

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

在您的示例中,您可以执行以下操作:

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

投影

  

projection参数确定在   匹配文件。 projection参数获取文档的   格式如下:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
     
      
  1. 1或true,以将字段包括在返回文档中。

  2.   
  3. 0或false以排除该字段。

  4.   

注意

  

对于_id字段,您不必显式指定_id:1到   返回_id字段。 find()方法始终返回_id字段   除非您指定_id:0禁止显示该字段。

READ MORE

答案 9 :(得分:2)

  

获取学生姓名

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

获得名字&amp;学生卷?

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

答案 10 :(得分:1)

在这里,三种方式,最无聊:无聊:

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

答案 11 :(得分:1)

gowtham's answer完成时,值得注意的是,这些命令可能与API上的命令有所不同(对于那些未使用mongo shell的命令)。
有关详细信息,请参阅documentation link

例如,

Nodejs 有一种称为`projection的方法,您可以将其追加到find函数以便进行投影。

按照相同的示例集,可以将以下命令与Node一起使用:

// sets visibility to visible progressBar.setVisibility(View.VISIBLE); // displaying document in webview String url = Uri.encode(fileUrl); document_viewer.getSettings().setJavaScriptEnabled(true); document_viewer.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); document_viewer.getSettings().setBuiltInZoomControls(true); document_viewer.getSettings().setUseWideViewPort(true); //document_viewer.getSettings().setPluginState(WebSettings.PluginState.ON); // loads documentUrl into webView document_viewer.loadUrl("http://docs.google.com/gview?embedded=true&url="+url); document_viewer.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // sets visibility to visible progressBar.setVisibility(View.VISIBLE); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false; } @Override public void onPageFinished(WebView view, String url) { // do your stuff here // sets visibility of progressBar to gone progressBar.setVisibility(View.GONE); // sets visibility of webView to visible document_viewer.setVisibility(View.VISIBLE); // setting the details of document on text Views title.setText(" Title : " + documentTitle); tag.setText(" Tag : " + documentTag); type.setText(" Type : " + documentType); comment.setText(" Comment : " + documentComment); distributee.setText(" Distributee : " + documentDistributee); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { view.loadUrl("about:blank"); Toast.makeText(getApplicationContext(), getResources().getString(R.string.error_occurred), Toast.LENGTH_LONG).show(); super.onReceivedError(view, errorCode, description, failingUrl); } });

  

选择_id,从学生那里滚动


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

  

从学生中选择卷

以此类推。

再次为nodejs用户服务,请不要忘记使用toArray(如果您之前使用过此API,应该已经熟悉了什么)来附加db.student.find({}).project({roll:1, _id: 0})命令。

答案 12 :(得分:1)

这里的MongoDB费用查询是收费,说明是一个字段。

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

答案 13 :(得分:1)

除了人们已经提到的内容之外,我只是在混合中引入索引。

想象一个大型集合,假设有超过 100 万个文档,您必须运行这样的查询。

如果您必须在其上运行此查询,则 WiredTiger 内部缓存必须将所有数据保留在缓存中,否则,在从 DB 检索之前,数据将从 FS 缓存或磁盘送入 WT 内部缓存已完成(如果是从连接到数据库的驱动程序中调用的,则分批进行并考虑到 1 次没有返回 100 万个文档,游标开始发挥作用)

覆盖查询可以是一种替代方法。直接从 docs 复制文本。

当索引覆盖查询时,MongoDB既可以匹配查询条件,也可以只使用索引键返回结果;即 MongoDB 不需要检查集合中的文档来返回结果。

当索引覆盖查询时,explain 结果有一个不是 FETCH 阶段的后代的 IXSCAN 阶段,并且在 executionStats 中,totalDocsExamined 为 0。

Query :  db.getCollection('qaa').find({roll_no : {$gte : 0}},{_id : 0, roll_no : 1})

Index : db.getCollection('qaa').createIndex({roll_no : 1})

如果此处的索引位于 WT 内部缓存中,那么获取值将是一个直接的过程。索引对系统的写入性能有影响,因此如果读取比写入多的话,索引会更有意义。

答案 14 :(得分:0)

在mongodb 3.4中我们可以使用以下逻辑,我不确定以前的版本

从学生选择滚动==&gt; db.student.find(!{},{roll:1})

上述逻辑有助于定义一些列(如果它们更少)

答案 15 :(得分:0)

如果你想要检索字段&#34; roll&#34;仅适用于集合中的所有10条记录。 然后尝试一下。

在MongoDb中:

  

db.students.find({},{&#34; roll&#34;:{&#34; $ roll&#34;})

在Sql中:

  

从学生中选择滚动

答案 16 :(得分:0)

在shell中使用这样的查询:

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

答案 17 :(得分:0)

我只想添加答案,如果您想显示嵌套在另一个对象中的字段,则可以使用以下语法

<ag-grid-angular class="ag-theme-material" style="width: 100%; height: calc(100vh - 200px);" rowSelection="single" animateRows="true" [rowHeight]="43" [columnDefs]="columnDefs" rowModelType="infinite" paginationPageSize="50" [rowData]="dataMarkList"> </ag-grid-angular>

此键位于名为object的对象内

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

答案 18 :(得分:0)

使用Studio 3T for MongoDB,如果我使用.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

答案 19 :(得分:0)

不确定是否可以回答问题,但我认为这里值得一提。 还有一种使用db.collection_name.distinct();

选择单个字段(而不是多个字段)的方法

例如db.student.distinct('roll',{});

或者,第二种方式:使用db.collection_name.find().forEach();(此处可以通过串联选择多个字段)

例如db.collection_name.find().forEach(function(c1){print(c1.roll);});

答案 20 :(得分:0)

_id = "123321"; _user = await likes.find({liker_id: _id},{liked_id:"$liked_id"}); ; 假设您在文档中有Liker_id和Liked_id字段,那么通过放置“ $ liked_id”它将仅返回_id和Liked_id。

答案 21 :(得分:0)

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

这相当于 -

  

从学生中选择滚动



    db.student.find({},{“roll”:1,“name”:1,“_ id”:0})

这相当于 -

  

选择roll,来自学生的姓名