查询嵌入文档中的特定键

时间:2014-09-26 08:56:27

标签: mongodb python-2.7 pymongo

我在我的mongodb上找到了一个,我也可以在pymongo做到这一点。

  

db.myTest.find({“cell”:“k12p125”})

     

{“_ id”:ObjectId(“5425194479df354955015855”),“cell”:“k12p125”,
  “fileInfo”:{“t50%”:95,“fName”:“file1”,“25%”:67,“min”:0,“50%”:70,“std”:23.155629597455047,“max”: 204,“75%”:93,“count”:42484,“mean”:78.01871292721965}}

     

{“_ id”:ObjectId(“5425197d79df3549550161e9”),“cell”:“k12p125”,“fileInfo”:{“t50%”:92,“fName”:“file2”,“25%”:69, “min”:0,“50%”:71,“std”:21.696940348452337,“max”:204,“75%”:90,“count”:42484,“mean”:78.14659636569061}}

     

{“_ id”:ObjectId(“542519b679df354955016b7d”),“cell”:“k12p125”,“fileInfo”:{“t50%”:95,“fName”:“file3”,“25%”:66, “min”:0,“50%”:70,“std”:23.58083230514195,“max”:205,“75%”:94,“count”:42484,“mean”:77.98015723566519}}

我想要做的是访问嵌入式文档。所以我有一个名为“cell”的键,我正在寻找“k12p125”的值。我想要做的是查找单元格k12p125然后拉出每个文件的所有“std”键以及每个文件的名称。所以我想要的信息是

细胞:k12p125
FNAME: “文件1”,性病:23.155629597455047
FNAME: “文件2”,标准:21.696940348452337
fName:“file3”,std:23.58083230514195

并且能够使用pymongo检索该信息。我还想知道,只要文件被排序,是否有办法直接获取每个文件的“标准”。我想要

细胞:k12p125
STD:23.155629597455047
STD:21.696940348452337
std:23.58083230514195

出来的std将按文件的排序顺序排列(std顺序为file1,file2,file3)。如果您需要更多说明,请告诉我。我很难概念化如何访问嵌入式文档,因此任何帮助都会很棒。 谢谢!

1 个答案:

答案 0 :(得分:0)

您无法通过基本查询获得所需的输出,但您可以通过简单的投影和排序来完成:

db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.fName" : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : 1})
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file1", "std" : 23.155629597455047 } }
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file2", "std" : 21.696940348452337 } }
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file3", "std" : 23.58083230514195 } }

或者,对于逆序:

db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.fName" : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : -1})
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file3", "std" : 23.58083230514195 } }
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file2", "std" : 21.696940348452337 } }
{ "cell" : "k12p125", "fileInfo" : { "fName" : "file1", "std" : 23.155629597455047 } }

您仍然需要处理fileInfo的顶级文档,但通常很容易与客户端打交道。

然后,对于返回std,类似地,即使您没有投射排序字段,仍然可以应用排序:

db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : -1})
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.58083230514195 } }
{ "cell" : "k12p125", "fileInfo" : { "std" : 21.696940348452337 } }
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.155629597455047 } }
db.foo.find({"cell" : "k12p125"}, {cell : 1, "fileInfo.std" : 1, _id : 0}).sort({ "fileInfo.fName" : 1})
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.155629597455047 } }
{ "cell" : "k12p125", "fileInfo" : { "std" : 21.696940348452337 } }
{ "cell" : "k12p125", "fileInfo" : { "std" : 23.58083230514195 } }

您需要确定查询模式的位置,以便进行适当的索引。 compound index cell作为最左边的元素,嵌入字段的组合可能就是您所需要的,但看起来完全取决于您最终构建查询的方式。 / p>