复杂json结构的Mongo DB查询
假设我有一个json结构,如下所示:复杂json结构的Mongo DB查询,json,mongodb,Json,Mongodb,假设我有一个json结构,如下所示: { "A":{ "name":"dog", "foo":"bar", "array":[ {"name":"one"}, {"name":"two"} ] }, "B":{ "name":"cat", "foo":"bar", "array":[ {"n
{
"A":{
"name":"dog",
"foo":"bar",
"array":[
{"name":"one"},
{"name":"two"}
]
},
"B":{
"name":"cat",
"foo":"bar",
"array":[
{"name":"one"},
{"name":"three"}
]
}
}
我想做两件事
1:查询“A.array”中的任何“name”:*
2:查询任何“名称”:“*.array”中的“一”
即,特定文档数组中的任何对象,以及任何文档数组中的任何特定对象
我希望我在这里使用了正确的术语,我刚刚开始熟悉这些概念。我试着寻找答案,但找不到像我这样的案例
谢谢
编辑:
由于我在这方面还没有取得真正的进展,我只想解释一下我正在尝试做什么:我想使用mtgjson.com上提供的“allset”数据集(在我将其削减到16mb以下之后)。不过,我在让蒙哥踢得漂亮方面遇到了问题
为了尝试了解发生了什么,我下载了一套:
以下是其结构布置的照片:
我甚至无法让mongo使用以下命令从卡阵列中返回对象:
查找({cards:{$elemMatch:{name:“欺骗者”}}})
查找({“cards.name”:“形式欺诈者”})
当我运行上面的任一命令时,它只会将整个文档返回给我。您可以使用运算符限制数组的内容。例如,如果您有一个如下所示的文档:
{
"block": "Battle for Zendikar",
"booster": "...",
"translations": "...",
"cards": [
{
"name": "Deceiver of Form",
"power": "8"
},
{
"name": "Eldrazi Mimic",
"power": "2"
},
{
"name": "Kozilek, the Great Distortion",
"power": "12"
}
]
}
您可以使用以下方法查询与“欺骗者”匹配的卡名,并且仅查询匹配的数组卡元素:
如上所述,我认为您应该重新考虑您的数据模型。MongoDB是一个数据库。MongoDB中的记录是一个文档,因此数据库中只有一条记录并不能发挥数据库的潜力,即类似于将所有数据存储在表中的一行中
您应该尝试将“卡”存储到一个存储库中。如果每个文档都是一张卡片(取决于您的用例),您可以添加对包含卡片组信息的另一个集合的引用。i、 e:块、类型、发布日期等,例如:
// a document in cards collection:
{
"name": "Deceiver of Form",
"power": "8",
"deck_id": 1
}
// a document in decks collection:
{
"deck_id": 1,
"releaseDate": "2016-01-22",
"type": "expansion"
}
有关不同类型的数据模型设计和示例,请参见 您可以始终使用
$或,例如“$或”:[{“A.array”:“one”},{“B.array”:“one”}]
,在这种情况下,它将实际匹配两种条件(或精确地在“A”上短路)。但是我怀疑你的真实结构应该用像“A”和“B”这样的东西来更好地表示,作为数组(可能还有其他字段)的附加属性,例如“array”:[{“name”:“one”,“type”:“A”},{“name”:“two”,“type”:“A”},{“name”:“one”,“type”:“B”}
等等。它通常会导致更简洁的查询。但是您的总体意图并不是很清楚。@Harrison文档根中的字段是否总是称为“A”和“B”,或者它们是否可以有任意名称?(顺便说一句,任意的名字都是不好的)谢谢你们的评论,伙计们,我编辑了主要的问题,试图让它更清楚地说明我想要实现的目标。
// a document in cards collection:
{
"name": "Deceiver of Form",
"power": "8",
"deck_id": 1
}
// a document in decks collection:
{
"deck_id": 1,
"releaseDate": "2016-01-22",
"type": "expansion"
}