【问题标题】:MongoDB query returning no resultsMongoDB 查询不返回任何结果
【发布时间】:2018-07-05 19:29:10
【问题描述】:

我是 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/});

以及它的变体。但是我尝试的每件事都返回零结果。

我做错了什么?

提前致谢!

【问题讨论】:

  • 您的查询省略了搜索键的 "-HGFsfes" 部分。你必须包括在内。所以.find({ "administrators.-HGFsfes.name": /Jos/})
  • 但是如何搜索“管理员”中的所有对象?
  • 很乱。您可能应该将 administrators 改为数组。
  • 它不是我的数据库。我不能改变结构
  • 那你的问题是stackoverflow.com/questions/19802502/…的骗子

标签: mongodb robo3t


【解决方案1】:

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

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

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

要实现你想要的,唯一要做的就是用一个数组替换管理员对象,所以你的文档将如下所示:

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

这样你的查询就可以工作了。

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

【讨论】:

  • 但是我做了你写的查询,返回特定的管理员,robomongo 将整个集合返回给我。我看错了吗?
  • 哪个查询?在哪个数据架构上?
  • 我更改了架构以使管理员成为数组,但它似乎不起作用
  • 您能提供您的新架构吗?如果它与这个相同,您的查询 db.getCollection('coll').find({ "administrators.name": /Jos/});必须工作
【解决方案2】:

你需要像这样使用查询:

db.collection_name.find({})

因此,如果您的集合名称是 coll,那么它将是:

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

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

另外,试试这样的正则表达式:

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

它只会给你一个结果,因为你的数据不是如下截图中的数组:

如果您想要多个结果,那么您需要重组数据。

【讨论】:

  • 你帮了我一点忙,但现在我每次都能得到每一个结果。在您发布的两个查询中,我得到了相同的结果。
  • 更新返回类似查询结果!!请看一下
  • 现在由于某种原因我没有得到任何结果
  • 在 mongo 中查找我附加的类似查询的链接
  • 结果仍然为零
【解决方案3】:

好的,我想我已经为您找到了一个更好的解决方案,使用聚合框架。 在您当前的集合上运行以下查询,将返回所有名为“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 控制台中复制/粘贴此查询,或在聚合选项卡中复制/导入(小图标“从剪贴板粘贴”)。

希望对你有帮助。

【讨论】:

  • 这个查询是唯一一个似乎真正有效的查询。但我真的不明白。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
相关资源
最近更新 更多