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


223

在我的MongoDB中,我有一个学生集合,其中包含10个具有字段name和的记录roll。此收藏的一条记录是:

{
    "_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链接到MongoDB映射。不知道我怎么想念这个。
Shipra Swati 2014年

Answers:


255

MongoDB文档

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

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

在从蒙戈的乡亲这个例子中,返回的文档将只包含的领域itemqty_id


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

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

上面的语句将选择学生集合中的所有文档,返回的文档将仅返回该roll字段(不包括_id)。

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


9
在Google看来似乎无法做到,所以值得一试。您是否必须明确排除所有不需要的字段?假设您只想要一个字段,但是文档中有10个字段必须明确设置0为其中的9 个字段?编辑:没关系,排除_id{field_I_want:1, _id:0}似乎工作
卡尔·Tryggvason

如果我使用投影,是否可以添加一个字段然后更新文档?
chovy

3
答案实际上都没有提到以下内容:注意:With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.这对某些人可能很有趣。(
user0800'9

137

从表中获取所有数据

db.student.find({})

选择*来自学生


从没有_id的表中获取所有数据

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

选择姓名,从学生那里滚


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

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

选择ID,从学生那里滚动


在没有_id的情况下从一个字段获取所有数据

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

从学生中选择卷


使用where子句查找指定的数据

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

选择*从学生所在的位置='80'


使用where子句并大于条件来查找数据

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

选择*从学生所在位置> 70


使用where子句并大于或等于条件来查找数据

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

选择*从学生所在位置>>'70'


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

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

选择*从学生所在位置滚动<='70'


使用where子句查找数据并小于条件

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

选择*从学生所在位置滚动<'70'



2
只是想添加,因为您的回答帮助我找出了解决方案,所以显示 _id 以外的所有属性将非常db.student.find({}, {_id:0})感谢您的帮助。
user8675309 '19

57

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

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

在此处输入图片说明


以显示mongo的输出及其返回的示例为例。
grepit

杜德(Dude)是否给我投反对票,因为我在回答中加入了屏幕截图?
grepit

是的,而且因为我看不到您的答案从@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
我认为您提到的命令来自猫鼬,而不是mongodb,但第3条命令除外。
Ashish

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

`



7

尽管gowtham的答案是完整的,但值得注意的是,这些命令可能与API上的其他命令有所不同(对于那些不使用mongo shell的命令)。
请参考文档链接以获取详细信息。

例如,Nodejs有一个名为`projection的方法,您可以将其附加到find函数中以便进行投影。

遵循相同的示例集,可以对Node使用以下命令:

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

SELECT _id,从学生那里滚动

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

从学生中选择卷

等等。

再次对Node.js用户来说,不要忘了(如果您以前使用过此API,您应该已经熟悉了)要toArray用来附加.then命令。


6
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. 0或false排除该字段。

注意

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

阅读更多


4

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

Selecting specific fields 

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

MySQL:选择名称,电子邮件,电话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:选择名称,电子邮件,电话,来自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})


1

如果您只想检索集合中所有10条记录的“ roll”字段。然后尝试这个。

在MongoDb中:

db.students.find({},{“ roll”:{“ $ roll”})

在Sql中:

从学生中选择卷


1

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

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

这里的键存在于名为object的对象中

{ "_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

使用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

0

不确定是否可以回答问题,但我认为这里值得一提。还有另一种方法可以选择使用单个字段(而不是多个)db.collection_name.distinct();

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.