如何查询mongodb的嵌套数组?

时间:2019-05-02 14:34:40

标签: mongodb

我有一个mongodb数据库,我想知道如何对它的对象执行以下操作:

  • 查询嵌套列表中的对象
  • 在单独的调用中更新该查询对象上的字段

应该注意的是,上面的2个操作不会彼此接近(或实现),而是在相同的上下文中是2个不同的要求。

假设我有一个类似下面的对象:

{'_id': ObjectId('5c783fcbfb971900174a12c2'),
 'actions': [{'_id': ObjectId('5c8027b2de30cc4c1e91934f'),
              'questions': [{'_id': ObjectId('5c802cd9de30cc4c1e919350'),
                             'is_required': True,
                             'possible_answers': [{'choice': 1,
                                                   'text': 'lamborghini'},
                                                  {'choice': 2,
                                                   'text': 'black-lamborghini'},
                                                  {'choice': 3,
                                                   'text': 'white-lamborghini'}],
                             'question_title': 'what is your favorite car?',
                             'question_type': 'MULTIPLE_CHOICE',
                             'sequence': 1},
                            {'_id': ObjectId('5c802cd9de30cc4c1e919351'),
                             'is_required': False,
                             'possible_answers': [{'choice': 1, 'text': 'blue'},
                                                  {'choice': 2,
                                                   'text': 'light-blue'},
                                                  {'choice': 3,
                                                   'text': 'dark-blue'}],
                             'question_title': 'what is your favorite color?',
                             'question_type': 'MULTIPLE_CHOICE',
                             'sequence': 2},
                            {'_id': ObjectId('5c802cd9de30cc4c1e919352'),
                             'is_required': True,
                             'question_title': 'what is your name?',
                             'question_type': 'DESCRIPTIVE',
                             'sequence': 3}]}]}

现在,我希望能够从该对象的动作问题中得到一个问题。我尝试了以下方法:

db.getCollection('mycollection').find(
{'_id': ObjectId('5ccafe351dd5c3ac3c0df2b3'),
 'actions': {'$elemMatch': {'_id': ObjectId('5ccafe351dd5c3ac3c0df2b3'),
                            'questions': {'$elemMatch': {'sequence': 'some-seq'}}}}},
 {'_id': 0, 'actions.$.questions': 1}
)

这给了我action的整个对象以及所有的问题;但这不是我想要的输出。

我想看到类似这样的内容(仅question及其字段):

{'_id': ObjectId('5c802cd9de30cc4c1e919350'),
 'is_required': True,
 'possible_answers': [{'choice': 1, 'text': 'lamborghini'},
                      {'choice': 2, 'text': 'lamborghini-black'},
                      {'choice': 3, 'text': 'lamborghini-white'}],
 'question_title': 'what is your favorite car?',
 'question_type': 'MULTIPLE_CHOICE',
 'sequence': 1}

我不必告诉你我已经尝试过{'_id': 0, 'actions.0.questions.$': 1},但到目前为止还没有运气。

0 个答案:

没有答案