复杂json结构的Mongo DB查询

复杂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

假设我有一个json结构,如下所示:

{
    "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"
    }