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

在我的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

我的要求是只找到一个钥匙,不附带任何条件。它的查询操作是什么。

558961 次浏览

MongoDB文档:

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

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

在Mongo的这个例子中,返回的文档将只包含itemqty_id字段。


因此,你应该能够发出这样的声明:

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

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

如果我们不提到_id:0,返回的字段将是roll_id。默认情况下总是显示'_id'字段。因此,我们需要显式地提到_id:0roll

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

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

> db.mycollection.find().pretty();


{
"_id": ObjectId("54ffca63cea5644e7cda8e1a"),
"host": "google",
"ip": "1.1.192.1"
}
db.mycollection.find({},{ "_id": 0, "host": 1 }).pretty();

出于教育目的,你也可以用以下任何一种方法:

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

尝试以下查询:

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

如果你正在使用控制台,你可以添加pretty()使其易于阅读。

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

希望这能有所帮助!!

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

它等于-

从学生中选择卷



db.student。Find ({}, {"roll":1, "name":1, "_id":0})

. Find ({}, {"roll":1, "name":1, "_id":0}

它等于-

从学生中选择卷名

得到学生的名字

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

在shell中像这样使用Query:

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

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

Select roll from student ==> db.student.find(!{}, {1}):

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

从表中获取所有数据

db.student.find({})

SELECT * FROM student


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

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

SELECT name, roll FROM student


从_id字段中获取所有数据

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

SELECT id, roll FROM student


从一个没有_id的字段中获取所有数据

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

从学生中选择卷


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

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

SELECT * FROM student WHERE roll = '80'


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

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

SELECT * FROM student WHERE roll >“70”


使用where子句和大于或等于condition查找数据

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

SELECT * FROM student WHERE roll >= '70'


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

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

SELECT * FROM student WHERE roll <= '70'


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

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

SELECT * FROM student WHERE roll <“70”

这对我很有用,

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

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

如果你只想为集合中的所有10条记录检索字段“roll”。

在MongoDb中:

db.students。Find ({}, {" roll ": {" $roll "})

Sql:

从学生中选择名单

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

Selecting specific fields

MongoDB: db.collection_name.find({},{名称:真的,电子邮件:真的,电话:真正});

MySQL: SELECT name,email,phone FROM table_name;

Selecting specific fields with where clause

MongoDB: db.collection_name.find({电子邮件:“you.com”},{名称:真的,电子邮件:真的,电话:真正});

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

在这里,有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
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

在你的例子中,你可以这样做:

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

投影

类型中返回哪些字段 匹配的文件。类型的文档为参数 以下形式:< / p >
{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1或true将该字段包含在返回文档中

  2. 0或false排除字段

请注意

对于_id字段,不需要显式地指定_id: 1 to 返回_id字段。find()方法总是返回_id字段

.

.

.

READ MORE

虽然gowtham的回答是完整的,但值得注意的是,这些命令可能在不同的API之间有所不同(对于那些不使用mongo's shell的API) 有关详细信息,请参考文档链接

例如,Nodejs有一个名为投影的方法,你可以将它附加到find函数中以进行投影。

按照相同的示例设置,可以在Node中使用如下命令:

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

SELECT _id, rollfrom student

< p >或< br > db.student.find({}).project({roll:1, _id: 0}) < / p >

从学生中选择卷

等等。

同样,对于nodejs用户,不要忘记(如果你之前使用过这个API,你应该已经熟悉了)使用toArray来附加你的.then命令。

我只是想在答案中补充一点,如果想要显示嵌套在另一个对象中的字段,可以使用以下语法

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

Here键存在于名为object的对象中

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


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

查询MongoDB这里的费用是收集和描述是一个字段。

db.getCollection('fees').find({},{description:1,_id:0})
我不确定这回答了问题,但我相信这里值得一提。 还有一种方法可以使用db.collection_name.distinct();

来选择单个字段(而不是多个)

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

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

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

< p > _id = "123321"; _user = await likes.find({liker_id: _id},{liked_id:"$liked_id"}); ; 假设在文档中有liker_id和liked_id字段,那么通过输入"$liked_id"它将只返回_id和liked_id
 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);
});
});
  • 它的工作

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

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

WiredTiger内部缓存将不得不保持所有的数据在缓存中,如果你必须运行这个查询,如果不是数据将被馈送到WT内部缓存从FS缓存或磁盘从DB检索之前完成(批量如果被调用从连接到数据库的驱动程序&假设一次没有返回100万个文档,光标就可以发挥作用了)

覆盖的查询可以是另一种选择。直接从文档复制文本。

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

当索引涵盖查询时,解释结果具有一个IXSCAN阶段,该阶段不是FETCH阶段的后代,并且在executionStats中,totaldocsexamining为0。

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


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

如果这里的索引在WT内部缓存中,那么获取值将是一个简单的过程。索引对系统的写性能有影响,因此,如果读的数量比写的数量多,这就更有意义了。

如果你在NodeJs中使用MongoDB驱动程序,那么上述答案可能不适合你。您将不得不执行类似的操作,以仅获得选定的属性作为响应。

import { MongoClient } from "mongodb";


// Replace the uri string with your MongoDB deployment's connection string.
const uri = "<connection string uri>";
const client = new MongoClient(uri);


async function run() {
try {
await client.connect();
const database = client.db("sample_mflix");
const movies = database.collection("movies");


// Query for a movie that has the title 'The Room'
const query = { title: "The Room" };


const options = {
// sort matched documents in descending order by rating
sort: { "imdb.rating": -1 },
// Include only the `title` and `imdb` fields in the returned document
projection: { _id: 0, title: 1, imdb: 1 },
};


const movie = await movies.findOne(query, options);


/** since this method returns the matched document, not a cursor,
* print it directly
*/
console.log(movie);
} finally {
await client.close();
}
}


run().catch(console.dir);
这段代码是从实际的MongoDB文档中复制的,你可以在这里检查。 https://docs.mongodb.com/drivers/node/current/usage-examples/findOne/ < / p >

For Single Update: db.collection_name.update({ field_name_1: ("value")}, { $set: { field_name_2 : "new_value" }}); < / p >

For MultiUpdate: db.collection_name.updateMany({ field_name_1: ("value")}, { $set: {field_name_2 : "new_value" }}); < / p >

确保索引正确。