Mongodb文档中的搜索键
下面是我在mongodb中插入的json。我需要找到持卡人价值为200的记录Mongodb文档中的搜索键,mongodb,Mongodb,下面是我在mongodb中插入的json。我需要找到持卡人价值为200的记录 { "_id": "11", "cardholders": { "100": [ { "message": "message1", "time": "timestamp" }, { "message": "message2", "time": "timestamp" } ],
{
"_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不知道这一点