Mongo DB查询复杂的json结构

时间:2016-02-05 03:20:38

标签: json mongodb

假设我有一个像这样的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

以下是其结构的照片:json structure

我甚至无法使用mongo从卡片阵列中返回一个对象: " find({cards:{$ elemMatch:{name:" Deceiver of Form"}}}}" "找到({" cards.name":"欺骗表格"})"

当我运行上面的任何一个命令时,它只会将整个文档返回给我。

1 个答案:

答案 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