猿教程 Logo

.Net连接MongoDb:在数组和嵌套文档中搜索

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

介绍

在上一篇文章中,我们通过了MongoDb中的4个逻辑运算符:$or,$and,$ not和$ nor。 我们看到他们使用的几个例子。 $ or,$and和$nor的语法也是类似的,因为我们必须提供与操作符链接的过滤器数组,而$ not的语法更简单。 您可能不会经常使用$and运算符,因为AND条件可以通过用逗号连接过滤器来简化。

在这篇文章中,我们将看到如何查询数组和嵌套文档。

在数组内搜索

我们将从最简单的情况开始,文档可以使用逗号分隔的数组。 我的意思是像“loc”数组,在zipcodes集合中具有地理坐标:

{
        "_id" : "01001",
        "city" : "AGAWAM",
        "loc" : [
                -72.622739,
                42.070206
        ],
        "pop" : 15338,
        "state" : "MA"
}

其他典型的例子包括例如 用于学生文档的文章文档或成绩数组的注释字符串数组。 事实证明,我们已经知道如何在这些简单的数组中查询,我们只是不了解它。 回想一下我们的第一个过滤器,我们查询了具有字段“name”和值“tv”的文档:

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

上述查询不仅检查产品集合中的文档是否具有属性“name”和值“tv”。 它还检查文档是否具有名为“name”的属性,以及该属性是否包含一个包含字符串值“tv”的数组。 MongoDb将直接在数组中查找,但不会在其中嵌套数组,即搜索只有一层深。 但是,在大多数情况下都足够了。 以下查询将查找其“loc”数组包含值为42.070206的所有文档,无论其在数组中的位置如何。 这是不太可能的情况,但我们导入的数据库没有更好的适合这个例子:

db.zipcodes.find({"loc" : 42.070206})

该查询将只找到一个文档。

餐馆收藏品也有一个名为“grade”的数组,但其结构更为复杂。 它包括一个子文档数组,而不是单个值。 我们需要学习另一种查询技术,以便在这些文档中进行搜索。 我们现在就这样做。

搜索子文档

子文档或嵌入文档的示例是餐馆文档的“地址”属性。 嵌入式文档又包括许多属性,如“建筑”:

"address" : {
                "building" : "2780",
                "coord" : [
                        -73.98241999999999,
                        40.579505
                ],
                "street" : "Stillwell Avenue",
                "zipcode" : "11224"
        }

我们如何找到所有的地址有邮政编码11224的餐馆? 这是点符号进入场景的地方。 这是解决方案:

db.restaurants.find({"address.zipcode" : "11224"})

以上查询意味着MongoDb可以给我所有的文件,它们有一个地址字段,后者又有一个字符串值为“11224”的邮政编码字段,或者是包含值“11224”的邮政编码数组。 查询返回72个文档。

在一系列嵌入式文档中进行搜索

我们现在知道如何在餐厅收藏的成绩数组中搜索。 让我们找到所有收到至少一个档次“C”的文件。即 所有等级数组的文档都包含一个具有值“C”的“grade”属性的嵌入式文档:

db.restaurants.find({"grades.grade" : "C"})

会找到2708个文件。

阵列相关的运算符

$ all操作符将帮助为数组提供多个搜索过滤器,例如“给我所有等级数组的grade属性都具有C和B值的所有文档”:

db.restaurants.find({"grades.grade" : {$all : ["C", "B"]}})

$ all运算符就像$或运算符一样在过滤器中引入一个数组。 只有那些至少有一个C和一个B等级的文件将被退回。 如果任一条件失败,则不会选择文档。 该查询返回1565个文档,以下是一个示例:

{
        "_id" : ObjectId("56edc2ff03a1cd840734dbb5"),
        "address" : {
                "building" : "1269",
                "coord" : [
                        -73.871194,
                        40.6730975
                ],
                "street" : "Sutter Avenue",
                "zipcode" : "11208"
        },
        "borough" : "Brooklyn",
        "cuisine" : "Chinese",
        "grades" : [
                {
                        "date" : ISODate("2014-09-16T00:00:00Z"),
                        "grade" : "B",
                        "score" : 21
                },
                {
                        "date" : ISODate("2013-08-28T00:00:00Z"),
                        "grade" : "A",
                        "score" : 7
                },
                {
                        "date" : ISODate("2013-04-02T00:00:00Z"),
                        "grade" : "C",
                        "score" : 56
                },
                {
                        "date" : ISODate("2012-08-15T00:00:00Z"),
                        "grade" : "B",
                        "score" : 27
                },
                {
                        "date" : ISODate("2012-03-28T00:00:00Z"),
                        "grade" : "B",
                        "score" : 27
                }
        ],
        "name" : "May May Kitchen",
        "restaurant_id" : "40358429"
}

如果我们想要找到所有3种类型的餐厅,即A,B和C,也会返回上述文件:

db.restaurants.find({"grades.grade" : {$all : ["C", "B", "A"]}})

请注意,数组中的元素的排序并不重要。

与数组有关的另一个运算符是对应于SQL中的IN子句的$ in运算符,例如。 WHERE id IN(1,2,3)。 以下查询将返回位于佛罗里达州(FL),印第安纳州(IN)和缅因州(ME)的邮政编码集合中的所有地方:

db.zipcodes.find({"state" : {$in : ["FL", "IN", "ME"]}})

邮政编码集合中有1890个这样的地方。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


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