PyMongo嵌套数组查询

时间:2019-03-05 08:02:39

标签: python-3.x mongodb nosql pymongo

问题简介

我正在使用Python-3.7.2Pymongo-3.7.2Mongo-4.0.3

我是使用MongoDB的新手。我有以下MongoDB数据,其中s.head()是我自己的预定义class method,用于打印在条件()下找到的前5个文档,这实际上意味着找到的每个文档的前5个。

In [115]: s.head()
{'_id': 2,
 'message': [{'content': 'aaaaaaaaaaaaaaaa',
              'sender': 'x',
              'time': datetime.datetime(2019, 3, 5, 7, 37, 25, 304000)},
             {'content': 'bbbbbbbbbbbbbbbbbbbbbbb',
              'sender': 'x',
              'time': datetime.datetime(2019, 3, 5, 7, 41, 23, 745000)},
             {'content': 'bbbbbbbbbbbbbbbbbbbbbbb',
              'sender': 'x333',
              'time': datetime.datetime(2019, 3, 5, 7, 43, 55, 772000)},
             {'content': 'bbbbbbbbbbbbbbbbbbbbbbb',
              'sender': '333x',
              'time': datetime.datetime(2019, 3, 5, 7, 44, 26, 628000)},
             {'content': 'bbbbbbbbbbbbbbbbbbbbbbb',
              'sender': 'y',
              'time': datetime.datetime(2019, 3, 5, 7, 44, 33, 907000)}]}

我想查询sender == 'x'处的所有消息,所以我想到了用以下代码查询它们的想法:

In [117]: list(s.collection.find({'message.sender': 'x'}))
Out[117]: 
[{'_id': 2,
  'message': [{'sender': 'x',
    'time': datetime.datetime(2019, 3, 5, 7, 37, 25, 304000),
    'content': 'aaaaaaaaaaaaaaaa'},
   {'sender': 'x',
    'time': datetime.datetime(2019, 3, 5, 7, 41, 23, 745000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},
   {'sender': 'x333',
    'time': datetime.datetime(2019, 3, 5, 7, 43, 55, 772000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},
   {'sender': '333x',
    'time': datetime.datetime(2019, 3, 5, 7, 44, 26, 628000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},
   {'sender': 'y',
    'time': datetime.datetime(2019, 3, 5, 7, 44, 33, 907000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'}]}]

In [118]: list(s.collection.find({'message.sender': 'y'}))
Out[118]: 
[{'_id': 2,
  'message': [{'sender': 'x',
    'time': datetime.datetime(2019, 3, 5, 7, 37, 25, 304000),
    'content': 'aaaaaaaaaaaaaaaa'},
   {'sender': 'x',
    'time': datetime.datetime(2019, 3, 5, 7, 41, 23, 745000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},
   {'sender': 'x333',
    'time': datetime.datetime(2019, 3, 5, 7, 43, 55, 772000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},
   {'sender': '333x',
    'time': datetime.datetime(2019, 3, 5, 7, 44, 26, 628000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},
   {'sender': 'y',
    'time': datetime.datetime(2019, 3, 5, 7, 44, 33, 907000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'}]}]

但是,以上两个代码都无法准确查询我想要的结果。我想要的结果是这样的:

In [117]: list(s.collection.find({'message.sender': 'x'}))
Out[117]: 
[{'_id': 2,
  'message': [{'sender': 'x',
    'time': datetime.datetime(2019, 3, 5, 7, 37, 25, 304000),
    'content': 'aaaaaaaaaaaaaaaa'},
   {'sender': 'x',
    'time': datetime.datetime(2019, 3, 5, 7, 41, 23, 745000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'},

In [118]: list(s.collection.find({'message.sender': 'y'}))
Out[118]: 
[{'_id': 2,
  'message': [{'sender': 'y',
    'time': datetime.datetime(2019, 3, 5, 7, 44, 33, 907000),
    'content': 'bbbbbbbbbbbbbbbbbbbbbbb'}]}]

问题

我的问题如下:

  1. 查询这种查询的最佳实践是什么?
  2. 我是否应该使用array来保存此类数据?我正在尝试跟踪有意义的数据(例如销售交易)并将数据绑定到用户的_id

谢谢!

0 个答案:

没有答案