>

필드 이름에 도트를 사용하는 방법?

예시 오류가 나타납니다 :

db.test2.insert({ "a.a" : "b" })
can't have . in field names [a.a]

  • 답변 # 1

    필드 이름의 점 기호를 \uff0E 에 해당하는 유니 코드로 바꿀 수 있습니다.

    db.test.insert({"field\uff0ename": "test"})
    db.test.find({"field\uff0ename": "test"}).forEach(printjson)
    { "_id" : ObjectId("5193c053e1cc0fd8a5ea413d"), "field.name" : "test" }
    
    

    더보기 :

    <올>

    http://docs.mongodb.org/manual/faq/developers/#faq-dollar-sign-escaping

    http://docs.mongodb.org/manual/core/document/#dot-notation

  • 답변 # 2

    실제로 검색어에 점을 사용할 수 있습니다. 참조 : http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

    이 특수한 점 기호로 인해 필드 이름에 사용할 수 없습니다. 대부분의 프로그래밍 언어에서는 식별자에 점 기호를 사용할 수 없습니다.

    db.test2.find({ "a.a" : "b" }) 쿼리를 작성할 수 있습니다  그러나 이러한 쿼리를 작성하려면 다음과 같이 객체를 삽입해야합니다. db.test2.insert({"a": {"a": "b"}}) . 그러면 필드 이름이 "a" 인 문서가 생성됩니다.   "a" 라는 필드를 포함하는 임베드 된 문서의 값  값이 "b" 인 (다시) .

  • 답변 # 3

    mongodb에서 나가는 데이터를 변환하는 pymongo 라이브러리를 사용하여 SONManipulator를 작성할 수도 있습니다. 단점이 있습니다. 성능에 영향을 미치며 (사용 사례에 따라 영향을 미침) 찾기를 사용하여 검색 할 때 키를 변환해야합니다.

    KeyTransform 클래스의 주석에서 코드를 사용하는 방법에 대한 예제가있는 코드는 다음과 같습니다.

    from pymongo.son_manipulator import SONManipulator
    class KeyTransform(SONManipulator):
        """Transforms keys going to database and restores them coming out.
        This allows keys with dots in them to be used (but does break searching on
        them unless the find command also uses the transform).
        Example & test:
            # To allow `.` (dots) in keys
            import pymongo
            client = pymongo.MongoClient("mongodb://localhost")
            db = client['delete_me']
            db.add_son_manipulator(KeyTransform(".", "_dot_"))
            db['mycol'].remove()
            db['mycol'].update({'_id': 1}, {'127.0.0.1': 'localhost'}, upsert=True,
                               manipulate=True)
            print db['mycol'].find().next()
            print db['mycol'].find({'127_dot_0_dot_0_dot_1': 'localhost'}).next()
        Note: transformation could be easily extended to be more complex.
        """
        def __init__(self, replace, replacement):
            self.replace = replace
            self.replacement = replacement
        def transform_key(self, key):
            """Transform key for saving to database."""
            return key.replace(self.replace, self.replacement)
        def revert_key(self, key):
            """Restore transformed key returning from database."""
            return key.replace(self.replacement, self.replace)
        def transform_incoming(self, son, collection):
            """Recursively replace all keys that need transforming."""
            for (key, value) in son.items():
                if self.replace in key:
                    if isinstance(value, dict):
                        son[self.transform_key(key)] = self.transform_incoming(
                            son.pop(key), collection)
                    else:
                        son[self.transform_key(key)] = son.pop(key)
                elif isinstance(value, dict):  # recurse into sub-docs
                    son[key] = self.transform_incoming(value, collection)
            return son
        def transform_outgoing(self, son, collection):
            """Recursively restore all transformed keys."""
            for (key, value) in son.items():
                if self.replacement in key:
                    if isinstance(value, dict):
                        son[self.revert_key(key)] = self.transform_outgoing(
                            son.pop(key), collection)
                    else:
                        son[self.revert_key(key)] = son.pop(key)
                elif isinstance(value, dict):  # recurse into sub-docs
                    son[key] = self.transform_outgoing(value, collection)
            return son
    
    

  • 답변 # 4

    JsonObject에 삽입하기 전에 myString.replace ( ".", "\ u2024")를 사용하여 키 값을 교체했습니다.

  • 답변 # 5

    def remove_dots(data):
        for key in data.keys():
            if type(data[key]) is dict: data[key] = remove_dots(data[key])
            if '.' in key:
                data[key.replace('.', '\uff0E')] = data[key]
                del data[key]
        return data
    
    

    이 재귀 적 방법은 dict의 키에서 모든 점 문자를\ uff0E로 바꿉니다. Fisk가 제안한대로

  • 이전 c++ - vector 를 vector 로 캐스트
  • 다음 PHP를 사용하여 Excel XLS를 CSV로 변환하는 방법