匹配查询-MongoDB

匹配查询-MongoDB,mongodb,mongodb-query,mongo-java,Mongodb,Mongodb Query,Mongo Java,我正在使用mongo存储我的文档。其中一个看起来像下面 Name: first: joe last: blo address: city: Paris state: London relatives: first order: aunt: ashley uncle: tom second order aunt: roma uncle: robin 我希望能够执行一个查询,将给我的文件匹配'阿姨':'罗马'。我正在使用mon

我正在使用mongo存储我的文档。其中一个看起来像下面

Name:
  first: joe
  last: blo
address:
  city: Paris
  state: London
relatives:
  first order:
      aunt: ashley
      uncle: tom
  second order
      aunt: roma
      uncle: robin
我希望能够执行一个查询,将给我的文件匹配'阿姨':'罗马'。我正在使用mongo java api访问它

根据我的理解和阅读,下面的查询应该是有效的,但它不是

 DBObject winner = new BasicDBObject("$match", new BasicDBObject("aunt", "roma") );
 System.out.println("count "+coll.aggregate(winner).getCommandResult());
有谁能帮我理解和解释为什么这是失败的

谢谢
K

我的建议是,为了更好地理解,先练习使用MongoDb javascript控制台对数据库集合测试查询,然后直接为您使用的驱动程序编写查询(在您的示例中是Java)。例如:

匹配这样描述的文档

{
    name: {
        first: "joe",
        last: "blo"
    } ,
    address: {
        city: "Paris",
        state: "London"
    },
    relatives: {
        first_order: {
            aunt: "ashley",
            uncle: "tom"
        },
        second_order: {
            aunt: "roma",
            uncle: "robin"
        }
    }
}
您可以构建这样的查询

db.my_collection.find({"relatives.second_order.aunt": "roma"})
要将文档插入名为
my_collection
的集合中,只需

db.my_collection.insert(
{
    name: {
        first: "joe",
        last: "blo"
    } ,
    address: {
        city: "Paris",
        state: "London"
    },
    relatives: {
        first_order: {
            aunt: "ashley",
            uncle: "tom"
        },
        second_order: {
            aunt: "roma",
            uncle: "robin"
        }
    }
})
为了将查询正确写入Java API,您可以阅读一些参考资料:

以及用于使用MongoDb控制台的文档,在本例中为查询子文档:


希望能有帮助

为什么人们发布普通JSON如此困难?这里没有理由使用聚合。当您希望通过相等方式查找文档时,可以使用普通的find-query。在这种情况下,您的错误是在文档的根级别搜索字段
arn:roma
。你在那里找不到它。该级别上仅有的字段是
名称
地址
亲属
。实际上,您要搜索的是字段“亲戚.二等.阿姨”:“roma”我不想知道“亲戚.二等.阿姨”这个结构。因此需要一个match子句。您需要一个MongoDB不支持的功能。您需要更改架构以支持一般查询需求。感谢您提供的信息,但正如我之前所说,我不想知道结构亲属。second_order.aunt可以搜索aunt。我不想依赖文档结构,因为我担心如果它们发生变化,那么我将不得不在我的一端进行更改以适应这种情况。我知道文档中肯定会有“阿姨”键,为什么我不能直接查询该键?你是说文档中的任何地方都有“阿姨”键(即使是任意嵌套的)?我真的不知道如果你不具备一些文档结构的基本知识,你怎么能做到这一点。是的,这是正确的。我知道,对于任何人来说,都会有一把叫做“阿姨”的钥匙,但我不想依赖它的结构。从某种意义上说,我的意思是在文档上执行lucene搜索,以找到我感兴趣的键。嗯,我刚刚想到,您所面临的问题可以通过ER数据库解决,在该数据库中,您将有一个表“阿姨”以及结构的其余部分。然后,您可以检索与“阿姨”有任何关系的实体。当然,这只是一个思考,不是一个实际的解决方案,因为它需要一个完整的重新设计。但是,事实上,在我看来,这个问题不是一个非SQL问题。让我解释一下这个问题,以便建立上下文。我有一堆yaml文件作为我的数据。这些是第三党的档案,我无法控制它们的结构。我需要存储它们,能够查询它们并对数据进行分析。例如,我需要知道有多少人有三等阿姨,他们的名字叫“roma”