xaroulis gekas
xaroulis gekas

Reputation: 165

Query nested documents mongodb with python pymongo

My data look like this:

{'_id': ObjectId('6068da8878fa2e568c42c7f1'),
 'first': datetime.datetime(2018, 1, 24, 14, 5),
 'last': datetime.datetime(2018, 1, 24, 15, 5),
 'maxid13': 12.5,
 'minid13': 7.5,
 'nsamples': 13,
 'samples': [{'c14': 'C',
              'id1': 3758.0,
              'id10': 0.0,
              'id11': 274.0,
              'id12': 0.0,
              'id13': 7.5,
              'id15': 0.0,
              'id16': 73.0,
              'id17': 0.0,
              'id18': 0.342,
              'id19': 6.3,
              'id20': 1206.0,
              'id21': 0.0,
              'id22': 0.87,
              'id23': 0.0,
              'id6': 2.0,
              'id7': -79.09,
              'id8': 35.97,
              'id9': 5.8,
              'timestamp1': datetime.datetime(2018, 1, 24, 14, 5),
              'timestamp2': datetime.datetime(2018, 1, 24, 9, 5)},
             {'c14': 'C',
              'id1': 3758.0,
              'id10': 0.0,
              'id11': 288.0,
              'id12': 0.0,
              'id13': 8.4,
              'id15': 0.0,
              'id16': 71.0,
              'id17': 0.0,
              'id18': 0.342,
              'id19': 6.3,
              'id20': 1207.0,
              'id21': 0.0,
              'id22': 0.69,
              'id23': 0.0,
              'id6': 2.0,
              'id7': -79.09,
              'id8': 35.97,
              'id9': 6.2,
              'timestamp1': datetime.datetime(2018, 1, 24, 14, 10),
              'timestamp2': datetime.datetime(2018, 1, 24, 9, 10)},
               .
               .
               .
               .

Can someone help on how to find for example the id13 when timestamp1 is equals to datetime.datetime(2018, 1, 24, 14, 5) Samples is an array. This is what i have wrote.

cursor = mydb1.mongodbbucket.aggregate(
          [
              {
                "$match": {
                   "samples.timestamp1": {"$eq": datetime.strptime("2018-01-24 14:10:00", "%Y-%m-%d %H:%M:%S")}
                }
              },

              {
                  "$project": {

                      "samples.id13": 1
                  }
              },
            ]
        )   )

The ideal output would be id13:7.5

Upvotes: 0

Views: 57

Answers (2)

xaroulis gekas
xaroulis gekas

Reputation: 165

This is the right answer from @dheemanthbhat:

cursor = mydb1.mongodbbucket.aggregate([
    { "$unwind": "$samples" },
    {
        "$match": {
            "samples.id13": { "$exists": true },
            "samples.timestamp1": { "$eq": datetime.strptime("2018-01-24 14:10:00", "%Y-%m-%d %H:%M:%S") }
        }
    },
    {
        "$project": {
            "samples.id13": 1
        }
    }
])

Upvotes: 0

Dheemanth Bhat
Dheemanth Bhat

Reputation: 4452

Try this:

cursor = mydb1.mongodbbucket.aggregate([
    { "$unwind": "$samples" },
    {
        "$match": {
            "samples.timestamp1": { "$eq": datetime.strptime("2018-01-24 14:10:00", "%Y-%m-%d %H:%M:%S") }
        }
    },
    {
        "$project": {
            "samples.id13": 1
        }
    }
])

Upvotes: 1

Related Questions