【问题标题】:query specific keys in an embedded document查询嵌入文档中的特定键
【发布时间】:2014-11-21 05:44:11
【问题描述】:

我在我的 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,“计数”:42484,“平均值”: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:"file1",std:23.155629597455047
fName:"file2",std:21.696940348452337
fName:"file3",std:23.58083230514195

并能够使用 pymongo 检索该信息。我还想知道是否有一种方法可以直接获取每个文件的“std”,只要文件被排序。我想要

单元格:k12p125
标准:23.155629597455047
标准:21.696940348452337
标准:23.58083230514195

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

【问题讨论】:

    标签: mongodb python-2.7 pymongo


    【解决方案1】:

    您无法通过基本查询获得完全想要的输出,但您可以通过简单的投影和排序来接近:

    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 indexcell 作为最左边的元素和嵌入字段的组合可能是您需要的,但具体的外观将取决于您最终如何构造查询。

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 2012-08-22
      • 2018-03-20
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多