我已经将一个巨大的json文件导入到mongoDB中。它已导入为一个完整的文档(带有一个_id)。我的json看起来像这样:
{
"_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,但我不知道如何。我可以使用mongo shell或PHP来做到这一点。
答案 0 :(得分:0)
这是因为您只指定了.find({})
操作的查询部分而不是投影部分。这是.find({})
:
db.collection.find({query}, {projection});
因此,您的查询应该类似于以下内容:
db.games.find({"Spele.Komanda.Speletaji.Speletajs.Nr":16},{"Spele.Komanda.Speletaji.Speletajs":1});
然而,这将比您想要的更多。要返回原先想要的内容,您需要投影操作员:https://docs.mongodb.com/manual/reference/operator/projection/
答案 1 :(得分:0)
您可以尝试以下聚合查询。
$filter
内部数组和$arrayElemAt
投影匹配的元素。
$map
在所有Kamadas中输出所有匹配的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]
}
}}
])