猿教程 Logo

.Net连接MongoDb:查询

介绍

在前面的教程中讨论了一些关于MongoDb插入的细节。 我们看到这是一个非常直截了当的操作。 我们使用“db”句柄,提供我们想要插入文档的集合的名称,在其上调用“insert”函数并传入一个JSON文档。 所有MongoDb文档必须具有由“_id”字段表示的唯一且不可变的ID。 默认情况下,它类型为来自BSON规范的ObjectId。 我们也可以自己提供整数或字符串或其他类型的ID,但是我们有责任在集合中ID是唯一的,否则我们会得到一个异常。 自动递增的整数ID在MongoDb中难以实现,但如果您希望遵守关系数据库中熟悉的ID设置策略,则将GUID作为ID的字符串存储是一个可行的选项。

在这篇文章中,我们将开始研究MongoDb中的查询,这将跨越多个帖子。 我们将主要看到很多简短的例子。

使用find查询

查询意味着我们想在一个集合中找到一些数据。 有时,我们想要找到所有这些,或者只是其中一些我们提供过滤器的地方。 偶尔,我们只想检索一个符合条件的文档。 换句话说,我们想要实现类似...

“SELECT [column],[column] FROM [table] WHERE [condition]”

我们已经以“find”功能的形式看到了一个例子:

use loadtest
db.products.find()

如果您遵循上一篇文章中的示例,那么没有任何过滤器的find()函数将产生如下所示的内容:

{ "_id" : 1, "name" : "radio", "stock_level" : 100 }
{ "_id" : "434b1534-fc4d-47aa-9406-6d48cae713d6", "name" : "tv", "stock_level" : 50 }
{ "_id" : "f96589ff-cac7-4fe0-a486-12c7697de069", "name" : "computer", "stock_level" : 80 }

所以这对应于没有WHERE子句的“SELECT * FROM [table]”查询。

通过提供给find函数的另一个JSON文档提供过滤。 例如。 如果我们要检索名称为“tv”的所有产品,那么我们可以写下列内容:

db.products.find({"name" : "tv"})

上述查询将找到一条记录,但是如果有多个文档中有一个字段“name”和值“tv”,我们会在这里看到它们。 很快,我们会将更大的数据集导入我们的数据库,以便我们可以运行更有趣的查询。 然而,重要的是开始小的地方更容易地展示基础知识。

所以这是一个单一的WHERE子句。 我们如何输入多个过滤器,如WHERE name ='tv'AND stock_level = 50? 我们只需要扩展JSON查询文档:

db.products.find({"name" : "tv", "stock_level" : 50})

其返回与上述相同的结果。

如果我们想限制返回的字段数量怎么办?即 我们如何在MongoDb中执行“SELECT name,stock_level FROM ...”查询类型? 当然有另一个JSON文件! 我们可以在JSON过滤器之后提供第二个JSON文档,我们可以使用“true”和“false”布尔值指定要显示和禁止的字段。 _id字段始终默认显示,所以如果我们要抑制它,那么我们必须指定如下:

db.products.find({"name" : "tv"}, {"_id" : false})

这返回...

{ "name" : "tv", "stock_level" : 50 }

...即。 除_id之外的所有字段。 如果我们只想看股票水平而不是其他任何东西,那么我们可以写下面的查询:

db.products.find({"name" : "tv"}, {"_id" : false, "stock_level" : true})

...产生以下内容:

{ "stock_level" : 50 }

此过滤器默认禁止“名称”和任何其他字段,我们不需要在字段选择器中指定像“name”:false,“some_other_prop”:false。

用findOne查询

函数findOne类似于find,但它只返回单个文档,即使过滤器匹配多个文档。 函数将返回单个随机匹配。 没有参数的findOne将随机返回单个文档,我们不能确定哪个,但是第一个文档是一个安全的赌注。 例如。 查询...

相关实例:

db.products.findOne()

...返回信息:

{ "_id" : 1, "name" : "radio", "stock_level" : 100 }

我们可以为find函数提供完全相同的参数。 这里有一个例子:

db.products.findOne({"name" : "tv"}, {"_id" : false, "stock_level" : true})

唯一的区别是findOne返回一个匹配的文档即使有很多。

findOne()可以帮助您熟悉数据集。 我们之前提到,MongoDb集合中没有严格的模式,但在实践中,一个集合中的文档将遵循一些定义良好的结构。 毕竟,只是因为您可以将客户和产品混合在一个名为“东西”的集合中,并不意味着您将在现实生活中进行项目。 我们喜欢在我们的数据库中结构合理的数据记录,对吧?

所以,如果你想查看一个集合的架构,可以在其上调用findOne,你可以看到它的一般结构,它的属性,它的类型和嵌入的文档。

Pretty JSON

我只想提到,我们可以告诉Mongo客户端以更好的格式呈现JSON文档。 我们可以在find或findOne后附加“pretty”功能,如下所示:

db.products.find().pretty()

结果是更可读的JSON:

{ "_id" : 1, "name" : "radio", "stock_level" : 100 }
{
        "_id" : "434b1534-fc4d-47aa-9406-6d48cae713d6",
        "name" : "tv",
        "stock_level" : 50
}
{
        "_id" : "f96589ff-cac7-4fe0-a486-12c7697de069",
        "name" : "computer",
        "stock_level" : 80
}

更复杂的文件,这些好处更加明显。

Count

在我们完成这篇文章之前,我想提一个快速的方法来找到一个集合中的文档数量。 我们可以通过count()函数找到该数字,如下所示:

db.products.count()

...明显返回3。 因此,如果您收到一个新的和未知的集合,您可以使用findOne和count来快速熟悉其结构和大小。

当然,MongoDb中有更多的查询技术,我们将在下一篇文章中继续探索这些功能。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/4.html