在mongodb中,投影意味着仅选择必要的数据,而不是选择文档的整个数据。 如果文档有5个字段,而您只需要显示3个字段,则仅从其中选择3个字段。 mongodb提供了一些投影运算符,可以帮助我们实现该目标。
让我们在下面详细讨论那些运算符。
$:
首先,我们将讨论$运算符。 此运算符将查询结果中包含的字段的内容限制为包含第一个匹配元素。
- 必须将其显示在查询文档中。
- 一个位置$运算符只能出现在投影文档中。
- 一次只能在查询文档中出现一个数组字段。
现在让我们看一下该运算符的基本示例。
db.collection.find( { : ... },{ ".$": 1 } )
在上面的示例中,您可以看到我们在集合上使用了find()。 该方法仅为数组保留1个值。 它指定在单个查询中,根据位置只能从数组中检索一个值。
数组字段限制:
由于查询文档中只能出现一个数组字段,因此如果该数组包含文档,则要在这些文档的多个字段上指定条件,我们可以使用什么?
$ elematch:
在MongoDB中,$ elemMatch投影运算符用于根据指定条件将查询结果中包含的数组字段的内容限制为仅包含数组中的第一个匹配元素。
- 数组的元素是文档。
- 如果多个元素匹配$ elemMatch条件,则运算符将返回数组中的第一个匹配元素。
- $ elemMatch投影运算符类似于位置$投影运算符。
为了描述有关此运算符的示例,我们必须有一个数据库,其中db包含许多文档类型数据。 在我看来,学生成绩单是合适的。 让我们看看查询。
db.grades.find( { records: { $elemMatch: { student: "stud1", grade: { $gt: 85 } } } } );
本示例返回grades集合中的所有文档,其中records数组中的任何元素都满足$ elemMatch表达式中的所有条件。 本示例返回成绩集合中的所有文档,其中records数组包含至少一个元素,其学生数等于stud1,并且成绩大于85。
但是,如果有两个参数说明同一学生的2个不同年级,会发生什么情况。 像这样:
db.grades.find( { records: { $elemMatch: { student: "stud1", grade: { $gt: 85 } } , : { student: "stud1", grade: { $gt: 90 } } } } );
因为在上面的查询中仅匹配1个参数,所以输出将完美显示。 在$ elematch中,必须匹配任何1个参数。 但是在下一种情况下:
db.grades.find( { records: { $elemMatch: { student: "stud1", grade: { $gt: 85 } } , : { student: "stud2", grade: { $gt: 90 } } } } );
因为没有嵌入式文档满足指定条件,所以它与查询不匹配。
投影运算符的区别:
位置($)投影运算符:
- 将查询结果中包含的数组字段的内容限制为包含与查询文档匹配的第一个元素。
- 要求查询条件中包含匹配的数组字段
- 仅当查询条件中出现单个数组字段时才可以使用
- 只能在投影中使用一次
$ elemMatch投影运算符
- 将查询结果中包含的数组字段的内容限制为仅包含与$ elemMatch条件匹配的第一个数组元素。
- 不需要将匹配数组包含在查询条件中
- 可用于匹配嵌入文档的数组元素的多个条件
$切片
$ slice运算符控制查询返回的数组的项数。 有关在使用$ push进行更新期间限制数组大小的信息,请改为使用$ slice修饰符。
让我们看一个基本的查询:
db.collection.find( { field: value }, { array: {$slice: count } } );
此操作选择一个由名为field的字段标识的文档集合,该字段保存值,并从存储在array字段中的数组返回由count值指定的元素数。 如果count的值大于数组中元素的数量,则查询将返回数组中的所有元素。
$ slice接受多种格式的参数,包括负值和数组。
正如您看到的基本代码一样,让我们看看如何从数组中检索一组注释。 让我们看下面:
db.posts.find( {}, { comments: { $slice: 5 } } )
在这里,$ slice在注释字段中选择数组中的前五个项目。
db.posts.find( {}, { comments: { $slice: -5 } } )
此操作返回数组中的最后五个项目。
因此,我们有第一个和最后五个评论。 但是,如果我们需要数组之间有一定数量的注释会怎样? 您必须稍微修改上面的代码。 如下:
db.collection.find( { field: value }, { array: {$slice: [skip,limit] } } );
因此,在上面的代码中,我们可以看到一对参数。 告诉我们如何从数组之间选择数据。 你怎么问
作为第一个参数,您可以看到我们已经使用了skip。 它告诉我们必须开始跳过数组中的多少个位置。 第二个是限制,它告诉我们计数在哪里停止? 让我们修改上面的示例以更好地理解:
db.posts.find( {}, { comments: { $slice: [5,10] } } )
在上面的示例中,w跳过了前5条注释,而忽略了它们。 跳过后,从第五个位置开始(因为数组定位从0开始),限制计数将开始。
$元
$ meta投影运算符为每个匹配的文档返回与查询关联的元数据(例如“ textScore”)。 $ meta表达式可以是投影文档的一部分,也可以是sort()表达式。
$ meta表达式具有以下语法:
{ <projectedFieldName>: { $meta: <metaDataKeyword> } }
textscore返回与每个匹配文档的相应query:$ text查询关联的分数。 文本分数表示文档与词干匹配的程度。 如果不与查询一起使用。 默认顺序为降序。
作为一个基本示例,我们可以看到以下代码集:
db.collection.find(
,
{ score: { $meta: "textScore" } }
)
$ meta表达式可以是sort()表达式的一部分。 我们稍后会详细介绍。
db.collection.find(
,
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
摘要:
就像在数据库中查找信息是一个非常重要的方面一样,我们可以在mongodb中称呼投影。 尽管在本文中我们已经刮伤了突起的表面。 说您可以理解,还有许多其他方法可以使用find()在mongodb中投影特定结果。
翻译自: https://www.javacodegeeks.com/2014/07/how-to-use-projection-in-mongodb.html