Mongodb文档中的搜索键

Mongodb文档中的搜索键,mongodb,Mongodb,下面是我在mongodb中插入的json。我需要找到持卡人价值为200的记录 { "_id": "11", "cardholders": { "100": [ { "message": "message1", "time": "timestamp" }, { "message": "message2", "time": "timestamp" } ],

下面是我在mongodb中插入的json。我需要找到持卡人价值为200的记录

 {
  "_id": "11",
  "cardholders": {
    "100": [
      {
        "message": "message1",
        "time": "timestamp"
      },
      {
        "message": "message2",
        "time": "timestamp"
      }
    ],
    "200": [
      {
        "message": "message1",
        "time": "timestamp"
      },
      {
        "message": "message2",
        "time": "timestamp"
      },
      {
        "message": "message3",
        "time": "timestamp"
      }
    ],
    "300": [
      {
        "message": "message1",
        "time": "timestamp"
      },
      {
        "message": "message2",
        "time": "timestamp"
      }
    ]
  }
}
请给我一些建议。我有以下几点

 db.test3.find({"message1":{$eq:true}})
> db.test3.find({"100":{$eq:true}})
> db.test3.find({cardholders:{$eq:'100'}})
> db.test3.find({cardholders:{$eq:100}})

实际上,您希望在find()查询中包含一个参数,该参数匹配只包含投影字段和
\u id
字段的文档。在这种情况下,由于键是
“200”
,因此可以投影它并使用光标获得如下值:

db.test3.find(
    {}, 
    {"cardholders.200": 1}
).map(function(doc){ return doc["cardholders"]["200"]})
db.test3.find(
    {"cardholders.key": "200"}, 
    { 
        "cardholders": { 
            "$elemMatch": { "key": "200" } 
        }
    }
);
输出

/* 0 */
{
    "0" : [ 
        {
            "message" : "message1",
            "time" : "timestamp"
        }, 
        {
            "message" : "message2",
            "time" : "timestamp"
        }, 
        {
            "message" : "message3",
            "time" : "timestamp"
        }
    ]
}

更新

为了简化查询,我建议更改您的模式,将持卡人密钥更改为包含嵌入式文档的数组。这些嵌入的文档将有一个键和值字段;键字段保存以前的动态键,值字段保存数组值:

{
  "_id": "11",
  "cardholders": [
    {
        "key": "100",
        "values": [
            {
                "message": "message1",
                "time": "timestamp"
            },
            {
                "message": "message2",
                "time": "timestamp"
            }
        ]
    },
    {
        "key": "200",
        "values": [
            {
                "message": "message1",
                "time": "timestamp"
            },
            {
                "message": "message2",
                "time": "timestamp"
            }
        ]
    },
    {
        "key": "300",
        "values": [
            {
                "message": "message1",
                "time": "timestamp"
            },
            {
                "message": "message2",
                "time": "timestamp"
            }
        ]
    }
  ]
}
然后,您可以使用投影组合查询嵌入文档,如下所示:

db.test3.find(
    {}, 
    {"cardholders.200": 1}
).map(function(doc){ return doc["cardholders"]["200"]})
db.test3.find(
    {"cardholders.key": "200"}, 
    { 
        "cardholders": { 
            "$elemMatch": { "key": "200" } 
        }
    }
);
我想找钥匙是不可能的

编辑:在持卡人上使用$exists操作符。(值),例如

老:可能会把事情改成:

 {
  "_id": "11",
  "cardholders": [
    {
      "array": [
        {
          "message": "message1",
          "time": "timestamp"
        },
        {
          "message": "message2",
          "time": "timestamp"
        }],
      "value": "100" (or 100)
    },
    {
      "array": [
        {
          "message": "message1",
          "time": "timestamp"
        },
        {
          "message": "message2",
          "time": "timestamp"
        },
        {
          "message": "message3",
          "time": "timestamp"
        }],
      "value": "200" (or 200)
    },
    {
      "array": [
        {
          "message": "message1",
          "time": "timestamp"
        },
        {
          "message": "message2",
          "time": "timestamp"
        }],
      "value": "300" (or 300)
    }
  ]
}
然后索引
持卡人。索引类型为1的值

并与以下内容一起使用:

 > db.test3.find({"cardholders.value": "200"})

(注意:请用你的编程语言标记你的问题,如果有的话。)

谢谢你的工作,你认为我可以用更好的方式重新构造这个json,并且仍然可以通过更简单的搜索查询获得类似的结果吗这也行得通,取自你的答案db.test3.find({},{“cardens.200”:1})@Amit绝对有效,对于MongoDB,建议在您有动态键的情况下重新构造您的模式,因为使用此类键进行查询很复杂。我已经用另一种模式方法更新了我的答案,并用更简单的方法查询了答案。有可能看看上面的answerdb.test3.find({},{“cardenrs.200”:1})这是可行的。ok:D不知道这一点