提问者:小点点

MongoDB:查询名称中有空格的键


我想从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})

那么如何在上面查询的第二个参数中使用键“P父['键3']”呢?有什么方法可以实现这一点吗?

这是返回数据的查询(有效):

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

这是不返回数据的查询:

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

共2个答案

匿名用户

你唯一能构建它的方法是:

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 })

它是“点表示法”而不是对象表示法,只要你引用键名(这是点表示法的强制性要求),那么一切都很好,你可以在里面有一个空格。

匿名用户

我知道这是一种错误的方法,因为理想情况下密钥名称中不应该有空格,但我如何查询此密钥?

我的建议是:

>

  • 使用批量写入操作从文档键中删除空格

    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 })