Php 如何查询深度嵌套的json文档?
我已经将一个巨大的json文件导入mongoDB。它已导入为一个完整的文档(具有一个_id)。我的json如下所示:Php 如何查询深度嵌套的json文档?,php,json,mongodb,nested,Php,Json,Mongodb,Nested,我已经将一个巨大的json文件导入mongoDB。它已导入为一个完整的文档(具有一个_id)。我的json如下所示: { "_id": ObjectId("bas8adsfa832034821"), "Spele": { "Laiks": "2017/01/11", "Skatitaji": 6740, "Vieta": "Newlands Stadium", "T": [ { "Uzvards": "Antamo
{
"_id": ObjectId("bas8adsfa832034821"),
"Spele": {
"Laiks": "2017/01/11",
"Skatitaji": 6740,
"Vieta": "Newlands Stadium",
"T": [
{
"Uzvards": "Antamo",
"Vards": "Dennis"
},
{
"Uzvards": "Prompa",
"Vards": "Pedro"
}
],
"Komanda": [
{
"Nosaukums": "Barcelona",
"Speletaji": {
"Speletajs": [
{
"Loma": "V",
"Nr": 16,
"Uzvards": "Sam",
"Vards": "Sidney"
},
{
"Loma": "A",
"Nr": 17,
"Uzvards": "Cisovsky",
"Vards": "Marian"
}
]
}
}
]
}
}
因此,对于我尝试的每个查询,它都会返回整个文档。设置特定参数没有帮助,例如:db.games.find({“Spele.Komanda.Speletaji.Speletajs.Nr”:16})
我希望它什么时候回来
{ "Loma" : "V",
"Nr" : 16,
"Uzvards" : "Sam"
"Vards" : ""Sidney"
}
但它会返回整个文档。也许我没有正确使用查询,或者我必须为每个嵌套文档提供_id,但我不知道如何使用。我可以使用MongoShell或PHP来完成此操作。这是因为您只指定
.find({})
操作的查询部分,而不指定投影部分。这是.find({})
的语法:
因此,您的查询应该更类似于:
db.games.find({"Spele.Komanda.Speletaji.Speletajs.Nr":16},{"Spele.Komanda.Speletaji.Speletajs":1});
然而,这将返回比你想要的更多。要提前返回所需的内容,需要使用投影运算符:这是因为您只指定
.find({})
操作的查询部分,而不指定投影部分。这是.find({})
的语法:
因此,您的查询应该更类似于:
db.games.find({"Spele.Komanda.Speletaji.Speletajs.Nr":16},{"Spele.Komanda.Speletaji.Speletajs":1});
然而,这将返回比你想要的更多。要提前返回所需的内容,您需要使用投影运算符:您可以尝试下面的聚合查询
$filter
内部数组和$arrayElemAt
以投影匹配的元素
$map
输出所有Kamada中所有匹配的Speletajs元素
$arrayElemAt
减少到单个匹配项。对于多个匹配项,请删除$arrayElemAt
db.games.aggregate([
{"$match":{"Spele.Komanda.Speletaji.Speletajs.Nr":16}},
{"$project":{
"Speletaji":{
"$arrayElemAt":[
{"$map":{
"input":"$Spele.Komanda",
"in":{
"$arrayElemAt":[
{"$filter":{
"input":"$$this.Speletaji.Speletajs",
"cond":{"$eq":["$$this.Nr",16]}
}},
0]
}
}},
0]
}
}}
])
您可以尝试下面的聚合查询
$filter
内部数组和$arrayElemAt
以投影匹配的元素
$map
输出所有Kamada中所有匹配的Speletajs元素
$arrayElemAt
减少到单个匹配项。对于多个匹配项,请删除$arrayElemAt
db.games.aggregate([
{"$match":{"Spele.Komanda.Speletaji.Speletajs.Nr":16}},
{"$project":{
"Speletaji":{
"$arrayElemAt":[
{"$map":{
"input":"$Spele.Komanda",
"in":{
"$arrayElemAt":[
{"$filter":{
"input":"$$this.Speletaji.Speletajs",
"cond":{"$eq":["$$this.Nr",16]}
}},
0]
}
}},
0]
}
}}
])
您好,谢谢您的回复,它工作完美无瑕,现在我知道了!不过我有一个问题-mongo.exe控制台是否有一个插件,这样我可以更轻松地编写这些查询(比如不同的工作区)?我听说有一个这样的应用程序,但是忘记了它的名字。你好,谢谢你的回复,它工作完美无瑕,现在我知道怎么做了!不过我有一个问题-mongo.exe控制台是否有一个插件,这样我可以更轻松地编写这些查询(比如不同的工作区)?我听说有一份申请,但忘了它的名字。