2015-07-12 36 views
6

Chcę pobrać wartości tylko niektórych kluczy z kolekcji MongoDB.MongoDB: Zapytanie o klucz o nazwie spacji w nazwie

Ale kolekcja ma kilka klawiszy, które mają „przestrzeń” w nazwie jak:

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

wiem, jest to błędne podejście, ponieważ nie powinno być idealnie przestrzenie w nazwę klucza, ale mimo jak mam zapytać o ten klucz? Używam Python i PyMongo.

Dla normalnych klawiszy mogę to zrobić:

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

Więc jak mam użyć klucza „rodzic [«klucz 3»]” w drugim argumencie powyższej kwerendy? Czy jest jakiś sposób, aby to osiągnąć?

Oto zapytanie, które zwraca dane (prac):

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

Oto zapytanie, które nie zwraca danych:

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

co jest nie tak z '' 'kluczem 3': 1} '? Teraz, jeśli nie wiesz, ile spacji w kluczu. Proponuję zaktualizować dokumenty i usunąć spacje z kluczy – styvane

+0

Przepraszam, zredagowałem trochę pytanie. Proszę spojrzeć. "Parent ['key 3']" nie działa. Działa tylko notacja kropkowa. –

+1

Co oznacza "nie działa"? Czy pojawia się błąd? Czym jest? Jaki kod właśnie uruchomiłeś, aby to zrobić (nie opublikowałeś tego)? – Ben

Odpowiedz

7

dobrze jedyny sposób mogłeś skonstruowaną to jest tak:

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

db.coll_name.insert(content) 

ale wydaje się, że brakuje, że nie ma nic złego w ten sposób:

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

Albo w projekcji

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

To "dot notation" a nie Object Notation, i tak długo, jak przytoczyć nazwy klawiszy (która jest obowiązkowa dla notacji kropkowej), wtedy wszystko jest w porządku i możesz mieć tam miejsce.

+0

Dzięki za wyczyszczenie tego!, nie zdawałem sobie sprawy, że używanie takiej notacji kropek było słusznym podejściem. :) –

1

wiem, jest to błędne podejście, ponieważ nie powinno być idealnie przestrzenie w nazwę klucza, niemniej jednak jak mam kwerendy ten klucz?

Co proponuję to:

  • Usuń przestrzeń z kluczowych dokumentów za pomocą 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() 
    
  • Wtedy twój występ się prostsze

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