我在工作中遇到了一个有趣的问题。我们有这样的文档结构:
{
"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,但这不是我在这里处理的问题。
请帮助!
答案 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
创建为不同集合中的文档。