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

Shi*_*ati 191 projection mongodb

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

{
    "_id" : ObjectId("53d9feff55d6b4dd1171dd9e"),
    "name" : "Swati",
    "roll" : "80",
}
Run Code Online (Sandbox Code Playgroud)

我想只检索roll集合中所有10条记录的字段,就像我们在传统数据库中一样,使用:

SELECT roll FROM student
Run Code Online (Sandbox Code Playgroud)

我浏览了很多博客,但所有博客都产生了一个查询,其中必须有WHERE条款,例如:

db.students.find({ "roll": { $gt: 70 })
Run Code Online (Sandbox Code Playgroud)

该查询相当于:

SELECT * FROM student WHERE roll > 70
Run Code Online (Sandbox Code Playgroud)

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

the*_*ica 218

来自MongoDB文档:

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

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

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


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

db.student.find({}, {roll:1, _id:0})
Run Code Online (Sandbox Code Playgroud)

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

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

  • 似乎谷歌这个,所以值得一试.您是否必须明确排除您不想要的所有字段?假设您只想要一个字段,但文档有10个,您必须明确地为其中的9个设置"0"吗?编辑:没关系,排除`_id`即`{field_I_want:1,_id:0}`似乎工作 (8认同)
  • 答案实际上都没有提到以下内容:注意:`_id字段除外,您不能在投影文档中合并包含和排除语句。`这对某些人可能很有趣。([来源](https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/)) (2认同)
  • 如果有人在使其工作时遇到问题,可能是因为您正在运行较新版本的 mongodb 驱动程序,该驱动程序对 API 进行了轻微更改: `db.students.find({}, {projection : { roll:1, _id:0您现在必须在“projection”键上指定要包含/排除的字段。文档:http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#find (2认同)

Gow*_*raj 100

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

db.student.find({})
Run Code Online (Sandbox Code Playgroud)

SELECT*FROM student

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

db.student.find({}, {_id:0})
Run Code Online (Sandbox Code Playgroud)

SELECT roll FROM student

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

db.student.find({}, {roll:1})
Run Code Online (Sandbox Code Playgroud)

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

db.student.find({}, {roll:1, _id:0})
Run Code Online (Sandbox Code Playgroud)

SELECT*FROM学生WHERE roll = '80'

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

db.student.find({roll: 80})
Run Code Online (Sandbox Code Playgroud)

SELECT*FROM student WHERE roll> '70'

使用where子句并且小于或等于condition查找数据

db.student.find({ "roll": { $gt: 70 }}) // $gt is greater than 
Run Code Online (Sandbox Code Playgroud)

SELECT*FROM student WHERE roll <='70'

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

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

SELECT*FROM学生WHERE roll <'70'

  • 只是想补充一下,因为你的回答帮助我找出了我的解决方案,显示所有属性 *除了* _id 将是 ```db.student.find({}, {_id:0})``` 感谢您的帮助. (5认同)

gre*_*pit 52

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

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

在此输入图像描述


Viv*_*shi 9

这是您的最爱,无聊的三种方式:

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
Run Code Online (Sandbox Code Playgroud)

删除特定字段,请使用-运算符:

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

  • 我认为你提到的命令来自猫鼬,而不是 mongodb,除了第三个命令。 (2认同)

Vag*_*kis 8

仅出于教育目的,您还可以通过以下任何一种方式来做到这一点:

1。

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

2。

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

`


Kar*_*nna 8

请尝试以下查询:

db.student.find({}, {roll: 1, _id: 0}).pretty();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!

  • Pretty() 仅在通过 shell 执行时才有用,而在脚本中则无用。 (2认同)

Has*_*mal 7

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

Selecting specific fields 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*ley 6

db.<collection>.find({}, {field1: <value>, field2: <value> ...})
Run Code Online (Sandbox Code Playgroud)

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

db.students.find({}, {"roll":true, "_id":false})
Run Code Online (Sandbox Code Playgroud)

投影

projection参数确定在匹配文档中返回哪些字段。projection参数采用以下格式的文档:

{ field1: <value>, field2: <value> ... }
Run Code Online (Sandbox Code Playgroud)
The <value> can be any of the following:
Run Code Online (Sandbox Code Playgroud)
  1. 1或true,以将字段包括在退货凭证中。

  2. 0或false排除该字段。

注意

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

阅读更多


Smi*_*ily 6

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

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

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

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

选择_id,从学生那里滚动

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

从学生中选择卷

等等。

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