假设我有一个像这样的json结构:
{
"A":{
"name":"dog",
"foo":"bar",
"array":[
{"name":"one"},
{"name":"two"}
]
},
"B":{
"name":"cat",
"foo":"bar",
"array":[
{"name":"one"},
{"name":"three"}
]
}
}
我希望能够做两件事。
1:在" A.array"内查询任何"名称":*。
2:查询任何"名称":"一个"在" *。array"。
即,特定文档数组中的任何对象,以及任何文档数组中的任何特定对象。
我希望我在这里使用了适当的术语,我刚开始熟悉很多这些概念。我一直试图寻找答案,但我找不到像我这样的事情。
感谢。
编辑: 由于我还没有真正取得进展,我只是解释一下我要做的事情:我想使用" AllSets"我在mtgjson.com上提供的数据集(在我修剪到16mb以下之后)。我很难让mongo玩得很好。
为了尝试了解正在进行的操作,我下载了一套:http://mtgjson.com/json/OGW.json。
我甚至无法使用mongo从卡片阵列中返回一个对象: " find({cards:{$ elemMatch:{name:" Deceiver of Form"}}}}" "找到({" cards.name":"欺骗表格"})"
当我运行上面的任何一个命令时,它只会将整个文档返回给我。
答案 0 :(得分:1)
您可以使用positional projection $运算符来限制数组的内容。例如,如果您有一个如下所示的单个文档:
{
"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"
}
]
}
您可以使用以下方式查询匹配"欺骗表单"和limit fields to return匹配的阵列卡元素的卡名称:
> db.collection.find({"cards.name":"Deceiver of Form"}, {"cards.$":1})
{
"_id": ObjectId("..."),
"cards": [
{
"name": "Deceiver of Form",
"power": "8"
}
]
}
说完上述内容后,我认为您应该重新考虑您的数据模型。 MongoDB是一个document-oriented数据库。 MongoDB中的记录是一个文档,因此在数据库中拥有单个记录并不会带来数据库的潜力,即类似于将所有数据存储在表中的单行中。
你应该尝试存储“卡片”。改为collection。如果每个文档都是一张卡片(根据您的使用案例),您可以添加对包含套牌信息的另一个集合的引用。即:block,type,releaseDate等。例如:
// 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"
}
有关不同类型的数据模型设计和示例,请参阅Data Model Design。