2015-07-12 101 views
6

我想從MongoDB集合中檢索某些鍵的值。MongoDB:查詢名稱中有空格的鍵

但是,收藏有一些按鍵,在他們的名字一個「空間」,如:

"Parent":{"key1": //some string, 
      "key2": //some string, 
      "key 3": //some string} 

我知道這是一種錯誤的做法,因爲不應該最好是在一個關鍵的名字空間但仍我如何查詢這個密鑰?我正在使用Python和PyMongo。我怎麼使用密鑰「親本‘鍵3’]」所以

db.coll_name.find({"key": "India"}, {"_id": 0, "Parent.key1": 1, "Parent.key2": 1}) 

在上面的查詢的第二個參數:

對於普通的按鍵我能做到這一點?有什麼辦法可以做到這一點?

這裏的返回數據(作品)查詢:

db.coll_name.find({}, {"Parent.key1": 1, "_id": 0}) 

這裏是沒有返回數據的查詢:

db.coll_name.find({}, {"Parent['key 3']": 1, "_id": 0}) 
+0

'{'key 3':1}'有什麼問題?現在如果你不知道密鑰有多少空間。那麼我建議你更新你的文件,並刪除鑰匙的空間 – styvane

+0

對不起,編輯這個問題一點。請看一看。 「父母''鍵3']」不起作用。只有點符號正在工作。 –

+1

「不起作用」是什麼意思?你有錯誤嗎?什麼是?你實際運行的代碼是什麼(你還沒有發佈) – Ben

回答

7

那麼你可能已經構建的必由之路這就像:

content = {}; 
content["Parent"] = {} 
content["Parent"]["key2"] = 1 
content["Parent"]["key 3"] = 1 

db.coll_name.insert(content) 

但你似乎缺少有什麼不妥這樣做:

db.coll_name.find({ "Parent.key 3": 1}) 

或者投影

db.coll_name.find({}, { "Parent.key 3": 1 }) 

這是"dot notation"和你引用的鍵名不反對的符號,而且只要(這是點符號必需的),那麼一切都很好,你可以在那裏有一個空間。

+0

感謝您的支持!,沒有意識到使用這樣的點符號是一種有效的方法。 :) –

1

我知道這是一種錯誤的方法,因爲在關鍵名稱中不應該有空格,但是如何查詢此關鍵字?

我會建議是:從文件重點用bulk write operations

bulk = coll_name.initialize_unordered_bulk_op() 
count = 1000 

for doc in coll_name.find(): 
    parent = {} 
    parent.setdefault('Parent', {}) 
    for key, val in doc['Parent'].items(): 
     parent['Parent'][key.replace(' ', '')] = val 
     bulk.find({'_id': doc['_id']}).update({'$set': parent}) 
     count += 1 
     if count % 1000 == 0: 
      # Execute per 1000 operations and re-init. 
      bulk.execute() 
      bulk = coll_name.initialize_unordered_bulk_op() 
# Clean up queues 
if count % 1000 != 0: 
    bulk.execute() 
    • 刪除空間,然後你的投影變得更簡單

      db.coll_name.find({'key': 'India'}, {'_id': 0, 'Parent.key1': 1, 'Parent.key2': 1, 'Parent.key3': 1 })