在嵌套文档中查找 mongodb

时间:2021-04-24 13:44:20

标签: python mongodb aggregate

我的数据如下所示:

{
    "_id" : ObjectId("60772a343d0e1058a8255145"),
    "first" : ISODate("2010-01-01T18:00:00Z"),
    "last" : ISODate("2010-01-01T18:55:00Z"),
    "maxid13" : -9999,
    "maxid9" : 7.9,
    "minid13" : -9999,
    "minid9" : 7.1,
    "nsamples" : 12,
    "samples" : [
        {
            "id1" : 3758,
            "id6" : 2,
            "id7" : -79.09,
            "id8" : 35.97,
            "id9" : 7.1,
            "id10" : 0,
            "id11" : -99999,
            "id12" : 0,
            "id13" : -9999,
            "c14" : "U",
            "id15" : 0,
            "id16" : 62,
            "id17" : 0,
            "id18" : -99,
            "id19" : -9999,
            "id20" : 1199,
            "id21" : 0,
            "id22" : -99,
            "id23" : 0,
            "timestamp1" : ISODate("2010-01-01T18:00:00Z"),
            "timestamp2" : ISODate("2010-01-01T13:00:00Z")
        },
        {
            "id1" : 3758,
            "id6" : 2,
            "id7" : -79.09,
            "id8" : 35.97,
            "id9" : 7.2,
            "id10" : 0,
            "id11" : -99999,
            "id12" : 0,
            "id13" : -9999,
            "c14" : "U",
            "id15" : 0,
            "id16" : 62,
            "id17" : 0,
            "id18" : -99,
            "id19" : -9999,
            "id20" : 1198,
            "id21" : 0,
            "id22" : -99,
            "id23" : 0,
            "timestamp1" : ISODate("2010-01-01T18:05:00Z"),
            "timestamp2" : ISODate("2010-01-01T13:05:00Z")
        }, 
       . 
       .
       .

我想执行这个查询:

mydb1.mongodbbucketright.find(
    {"samples.timestamp1": {"$gte": datetime.strptime("2010-01-01 00:05:00", "%Y-%m-%d %H:%M:%S"),
                               "$lte": datetime.strptime("2010-01-02 00:05:00", "%Y-%m-%d %H:%M:%S")},
     "samples.id13":{"$gt":5}},

    {"samples.$": 1 })

这是在嵌套文档中查找的正确方法吗? 我认为得到的结果比平时少。 执行时间对我来说很重要,所以如果我可以成功使用 find,我不想使用聚合。

使用聚合,我可以像这样执行这个查询:

mydb1.mongodbbucketright.aggregate([

    {
        "$match": {
            "first": {"$gte": datetime.strptime("2010-01-01 00:05:00", "%Y-%m-%d %H:%M:%S"),
                          "$lte" :datetime.strptime("2010-01-02 00:05:00", "%Y-%m-%d %H:%M:%S")},
            "samples.id13": {"$gt": 5}
        }
    },
    { "$unwind": "$samples" },
    {
        "$match": {
            "first": {"$gte": datetime.strptime("2010-01-01 00:05:00", "%Y-%m-%d %H:%M:%S"),
                      "$lte": datetime.strptime("2010-01-02 00:05:00", "%Y-%m-%d %H:%M:%S")},
            "samples.id13": {"$gt": 5}
        }
    },


])

您认为哪种方式是正确的? 提前致谢!

0 个答案:

没有答案