搜索嵌套在另一个文档中的一组文档

时间:2014-02-21 23:30:21

标签: mongodb

我在工作中遇到了一个有趣的问题。我们有这样的文档结构:

{
"q" : "c1179beb-2db4-4052-b10d-f0c1332436f3",
"ssm" : {
    "0168edb0-c25d-42ba-ba6d-918c4f61f6e1" : {
        "xas" : [],
        "dob" : ISODate("2001-01-01T00:00:00.000Z"),
        "we" : "bow-bq",
        "gndr" : "M",
        "lcd" : ISODate("2014-02-21T09:00:04.575Z"),
        "re" : "tyjhgj",
        "s" : "0168edb0-c25d-42ba-ba6d-918c4f61f6e1",
        "scsv" : "testdata",
        "sg" : {
            "grd" : "FOUR",
            "gdn" : "4"
        },
        "sno" : "100000002",
        "sss" : "Ha",
        "stst" : {
            "tk" : "226",
            "tn" : "That"
        },
        "tsd" : ISODate("2014-02-21T08:35:51.075Z")
    },
    "016e48fa-5c24-4fd5-b078-5333991de013" : {
        "xas" : [],
        "dob" : ISODate("2001-01-01T00:00:00.000Z"),
        "we" : "dsgsdf",
        "gndr" : "M",
        "lcd" : ISODate("2014-02-21T09:04:11.995Z"),
        "lia" : 53,
        "re" : "ghjghjgh",
        "s" : "016e48fa-5c24-4fd5-b078-5333991de013",
        "scsv" : "testdata",
        "sg" : {
            "grd" : "FOUR",
            "gdn" : "4"
        },
        "sno" : "100000029",
        "sss" : "Ha",
        "stst" : {
            "tk" : "86",
            "tn" : "That"
        },
        "tsd" : ISODate("2014-02-21T08:50:55.821Z")
    },
    "076fc7ab-264b-4814-9f3a-db9f8222d02f" : {
        "xas" : [],
        "dob" : ISODate("2001-01-01T00:00:00.000Z"),
        "we" : "hjhyyio",
        "gndr" : "M",
        "lcd" : ISODate("2014-02-21T09:04:58.299Z"),
        "lia" : 53,
        "re" : "qsdrfg",
        "s" : "076fc7ab-264b-4814-9f3a-db9f8222d02f",
        "scsv" : "testdata",
        "sg" : {
            "grd" : "FOUR",
            "gdn" : "4"
        },
        "sno" : "100000003",
        "sss" : "HA",
        "stst" : {
            "tk" : "161",
            "tn" : "That"
        },
        "tsd" : ISODate("2014-02-21T08:52:04.471Z")
    },
"try" : "34534",
"jyu" : ISODate("2014-03-01T07:59:59.000Z"),
"poij" : ISODate("2014-01-08T08:00:00.000Z")

}
}

显然,这是为了隐藏源而编辑的数据,但结构是相同的。

我正在尝试编写一个查询,该查询将搜索子文档“ssm”中包含的子文档的“s”字段。

我尝试过使用$ elementmatch以及使用标准点表示法。我遇到的问题是“ssm”字段更像是子文档而不是子文档。我有点失落,我希望得到一些建议。

阅读Mongo文档我似乎无法找到查询子集合的任何方法。谷歌向我展示了很多方法来查询文件的ARRAY,但这不是我在这里处理的问题。

请帮助!

2 个答案:

答案 0 :(得分:0)

如您所知,列出的项目是子文档,而不是数组的成员。因此,您有没有方式引用基础值,而不知道嵌套级别中键的组成。

我引用了我的this answer,所有这些都在同一主题上,所以可能值得一读。但是如果你想对它进行任何有意义的查询分析,那么这里的数据结构存在很大的缺陷。因此,更改,而另一个答案和您自己的调查结果应该是令人信服的理由。

没有简单的解决方案来处理这样的结构,this question并且答案可以提供一些有关如何“发现”关键名称以便提供查询信息的见解。但那将是一个艰苦的过程。

MongoDB的优势在于它允许您以比关系设置更灵活的方式更改事物。文档设计的灵活性为您提供了“足够的绳索”,并且重新设计通常是您开发过程中的必需品。

将结构更改为有效的结构。

答案 1 :(得分:0)

而不是:

{
"q" : "c1179beb-2db4-4052-b10d-f0c1332436f3",
"ssm" : {
    "0168edb0-c25d-42ba-ba6d-918c4f61f6e1" : {
        "dob" : ISODate("2001-01-01T00:00:00.000Z"),
        },
    },
    "016e48fa-5c24-4fd5-b078-5333991de013" : {
        "dob" : ISODate("2001-01-01T00:00:00.000Z"),
    }
}

试试这个:

{
"q" : "c1179beb-2db4-4052-b10d-f0c1332436f3",
"ssm" : [
          {
           "name": "0168edb0-c25d-42ba-ba6d-918c4f61f6e1",
           "dob" : ISODate("2001-01-01T00:00:00.000Z"),
          },
          {
           "name": "016e48fa-5c24-4fd5-b078-5333991de013",
           "dob" : ISODate("2001-01-01T00:00:00.000Z"),
          }
 ],
 "foo": "bar"
}

这样,您可以通过find(ssm.dob: date)搜索某人拥有DOB的文档。找到文档后,您仍然需要扫描子文档以查看哪个匹配。

如果您不喜欢,则需要将每个someone创建为不同集合中的文档。