MongoDB查询未返回任何结果

时间:2018-07-05 19:29:10

标签: mongodb robo3t

我是mongo的新手,正在尝试在此集合中执行一个非常简单的查询:

{
    "_id" : ObjectId("gdrgrdgrdgdr"),
    "administrators" : {
        "-HGFsfes" : {
            "name" : "Jose",
            "phone" : NumberLong(124324)
        },
        "-HGFsfqs" : {
            "name" : "Peter",
            "phone" : "+43242342"
        }
    },
    "countries" : {
        "-dgfgrdg : {
            "lang" : "en",
            "name" : "Canada"
        },
        "-grdgrdg" : {
            "lang" : "en",
            "name" : "USA"
        }
    }
}

如何进行查询以返回名称为“%Jos%”的管理员的结果。

到目前为止,我所做的是:db.getCollection('coll').find({ "administrators.name": /Jos/});

以及其他变化。但是我尝试的每件事都会返回零结果。

我在做什么错了?

谢谢!

3 个答案:

答案 0 :(得分:1)

您需要使用如下查询:

db.collection_name.find({})

因此,如果您的集合名称为coll,则为:

db.coll.find({"administrators.-HGFsfes.name": /Jos/});

在mongo中向this查找类似查询。

此外,尝试使用正则表达式模式,如下所示:

db.coll.find({"administrators..-HGFsfes.name": {"$regex":"Jos", "$options":"i"}}});

它只会给您一个结果,因为您的数据不是屏幕截图中所示的数组: enter image description here

如果要获得多个结果,则需要重组数据。

答案 1 :(得分:1)

您的错误是管理员不是数组,而是带有字段的对象,这些对象本身就是带有name字段的对象。正确的查询将是

{ "administrators.-HGFsfes.name": /Jos/}

不幸的是,这种方式只查询-HGFsfes名称字段,而不查询其他管理员名称字段。

要实现您想要的目标,唯一要做的就是用数组替换Administrators对象,因此您的文档将如下所示:

    { 
    "administrators" : [
        {
            "id" : "-HGFsfes", 
            "name" : "Jose", 
            "phone" : 124324
        }, 
        {
            "id" : "-HGFsfqs", 
            "name" : "Peter", 
            "phone" : "+43242342"
        }
    ], 
 countries : ...
}

这样,您的查询将起作用。

但是它将返回文档,其中管理员数组中至少一个条目具有匹配的名称字段。要仅返回管理员匹配元素,而不是整个文档,请check this question and my answer退卷/匹配/ group聚合管道。

答案 2 :(得分:1)

好吧,以为我为您找到了一个使用聚合框架的更好的解决方案。 在当前集合上运行以下查询,将返回所有名称为“ LIKE” jos的管理员(使用i选项不区分大小写):

db.test1.aggregate(
    [
        {
            $project: {
              administrators:{    $objectToArray: "$administrators"}
            }
        },
        {
            $unwind: {
                path : "$administrators"
            }
        },
        {
            $replaceRoot: {
            newRoot:"$administrators"
            }
        },
        {
            $match: {
            "v.name":/jos/i
            }
        },
    ]
);

输出

{ 
    "k" : "-HGFsfes", 
    "v" : {
        "name" : "Jose", 
        "phone" : NumberLong(124324)
    }
}

“ k”和“ v”来自"$objectToArray" operator,您可以添加$project stage重命名它们(如果k值无关紧要,则将其丢弃)

不确定是否要进行Robomongo测试,但是在Studio 3T(以前为Robomongo)中,您可以在Intellishell控制台中复制/粘贴此查询,也可以在聚合选项卡中复制/导入(小图标“从剪贴板粘贴”)。

希望有帮助。