我想从MongoDB集合中检索仅某些键的值。
但是,该系列有一些钥匙,有一个空间'在他们的名字像:
"Parent":{"key1": //some string,
"key2": //some string,
"key 3": //some string}
我知道这是一个错误的方法,因为理想情况下不应该是键名中的空格,但是我如何查询这个键呢?我正在使用Python和PyMongo。
对于普通按键我可以这样做:
db.coll_name.find({"key": "India"}, {"_id": 0, "Parent.key1": 1, "Parent.key2": 1})
那么如何使用密钥"父['密钥3']"在上面的查询的第二个参数?有没有办法实现这个目标?
这是返回数据(工作)的查询:
db.coll_name.find({}, {"Parent.key1": 1, "_id": 0})
以下是不会返回数据的查询:
db.coll_name.find({}, {"Parent['key 3']": 1, "_id": 0})
答案 0 :(得分:10)
你可以构建它的唯一方法就是:
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"而不是对象表示法,只要你引用键名(这对于点表示法是必需的)那么一切都很好,你可以在那里有一个空格。
答案 1 :(得分:1)
我知道这是一种错误的方法,因为理想情况下,键名中不应有空格,但我如何查询此键呢?
我建议的是:
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 })