簡體   English   中英

難以理解mongo聚合

[英]Trouble understanding mongo aggregation

我試圖列出我的mongo數據庫中使用特定數據存儲EMC_123的所有虛擬機(vms)。 我有此腳本,但它列出了不使用數據存儲EMC_123的vms。

#!/usr/bin/env python
import pprint
import pymongo
def run_query():
    server = '127.0.0.1'
    client = pymongo.MongoClient("mongodb://%s:27017/" % server)
    db = client["data_center_test"]
    collection = db["data_centers"]
    pipeline = [
        { "$match": { "clusters.hosts.vms.data_stores.name" : "EMC_123"}},
        { "$group": { "_id" : "$clusters.hosts.vms.name" }}
    ]
    for doc in list(db.data_centers.aggregate(pipeline)):
        pp = pprint.PrettyPrinter()
        pp.pprint(doc)
    pp.pprint (db.command('aggregate', 'data_centers', pipeline=pipeline, explain=True))


def main():
    run_query()
    return 0

# Start program
if __name__ == "__main__":
    main()

我認為我的管道有問題。 這是打印出來的計划:

{u'ok': 1.0,
 u'stages': [{u'$cursor': {u'fields': {u'_id': 0,
                                   u'clusters.hosts.vms.name': 1},
                       u'query': {u'clusters.hosts.vms.data_stores.name': u'EMC_123'},
                       u'queryPlanner': {u'indexFilterSet': False,
                                         u'namespace': u'data_center_test.data_centers',
                                         u'parsedQuery': {u'clusters.hosts.vms.data_stores.name': {u'$eq': u'EMC_123'}},
                                         u'plannerVersion': 1,
                                         u'rejectedPlans': [],
                                         u'winningPlan': {u'direction': u'forward',
                                                          u'filter': {u'clusters.hosts.vms.data_stores.name': {u'$eq': u'EMC_123'}},
                                                          u'stage': u'COLLSCAN'}}}},
         {u'$group': {u'_id': u'$clusters.hosts.vms.name'}}]}

更新:

這是文檔外觀的框架:

{
   "name" : "data_center_name",
   "clusters" : [
      {
         "hosts" : [
            {
               "name" : "esxi-hostname",
               "vms" : [
                  {
                     "data_stores" : [ { "name" : "EMC_123" } ],
                     "name" : "vm-name1",
                     "networks" : [ { "name" : "vlan334" } ]
                  },
                  {
                     "data_stores" : [ { "name" : "some_other_data_store" } ],
                     "name" : "vm-name2",
                     "networks" : [ { "name" : "vlan334" } ]
                  }
               ]
            }
         ],
         "name" : "cluster_name"
      }
   ]
}

我看到的問題是,當它沒有EMC_123作為數據存儲時,結果中會顯示vm-name2

Upate 2:

好的,我能夠編寫一個mongo shell查詢來實現我想要的功能。 這有點丑陋:

db.data_centers.aggregate({$unwind: '$clusters'}, {$unwind: '$clusters.hosts'}, {$unwind: '$clusters.hosts.vms'}, {$unwind: '$clusters.hosts.vms.data_stores'}, {$match: {"clusters.hosts.vms.data_stores.name": "EMC_123"}})

我在這個SO問題的第二個答案中談到了這一點: 嵌套數組的MongoDB投影

基於嵌套數組的MongoDB投影中的答案,我不得不將pipeline更改為此:

pipeline = [
         {'$unwind': '$clusters'},
         {'$unwind': '$clusters.hosts'},
         {'$unwind': '$clusters.hosts.vms'},
         {'$unwind': '$clusters.hosts.vms.data_stores'},
         {'$match': {"clusters.hosts.vms.data_stores.name": "EMC_123"}}
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM