복붙노트

[MONGODB] 어떻게 필드 이름에 점 사용 하는가?

MONGODB

어떻게 필드 이름에 점 사용 하는가?

어떻게 필드 이름에 점 사용 하는가?

나는 예에서 오류를 참조하십시오

db.test2.insert({ "a.a" : "b" })

can't have . in field names [a.a]

해결법

  1. ==============================

    1.당신은 \ uff0E의 해당하는 유니 코드로 필드 이름의 상징을 점 대체 할 수있다

    당신은 \ uff0E의 해당하는 유니 코드로 필드 이름의 상징을 점 대체 할 수있다

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

    더보기:

  2. ==============================

    2.Actualy 당신은 쿼리에서 점을 사용할 수 있습니다. 참조 : http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

    Actualy 당신은 쿼리에서 점을 사용할 수 있습니다. 참조 : http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

    이 때문에 특별한 점 심볼의 당신은 필드 이름에 사용할 수 없습니다 의미한다. 당신은 프로그래밍 언어의 대부분의 식별자에 기호를 점 사용할 수있다.

    당신은 쿼리 db.test2.find ({ "AA"의 "B"}) 쓸 수 있습니다하지만 당신은 쿼리를 쓸 수 있으려면 그렇게처럼 개체를 삽입해야합니다 db.test2.insert ({ "는 "{"A ":"B "}}). 이것은 "A"값이 "B"와 "A"(다시)이라는 필드를 포함하는 임베디드 문서의 값이라는 필드로 문서를 작성한다.

  3. ==============================

    3.또한 변환 데이터에 가서 MongoDB를 밖으로 백업하는 pymongo 라이브러리를 사용하여 SONManipulator를 작성할 수 있습니다. 단점이있다; 이 성능 저하는 (영향은 사용 사례에 따라 다름) 및 찾기를 사용하여 검색을 수행 할 때 당신은 당신의 키를 변환해야합니다.

    또한 변환 데이터에 가서 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. ==============================

    4.I는 myString.replace을 사용하여 키 값을 교환 ( ".", "\ u2024")로 된 JSONObject 삽입하기 전에.

    I는 myString.replace을 사용하여 키 값을 교환 ( ".", "\ u2024")로 된 JSONObject 삽입하기 전에.

  5. ==============================

    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
    

    이 재귀 방법은 \ uff0E와 딕셔너리의 키에서 모든 점 문자를 대체 피스크에 의해 제안

  6. ==============================

    6.처음에 나는 모든 대체하는 간단한 재귀를 사용하는 "." 유니 코드 동등한 문자 만은 값도 도트를 교체하기 것을 그것을 알아 냈다. 나는 우리가 단지 키에서 도트를 교체해야한다고 생각하고는 "만약 isinstance (입력, DICT)"경우에 따라 변경했다 그래서. 나는 마술을 할 수있는 충분 조건이 될한다고 생각하지만 난 그 DICT 값 또한 딕셔너리 또는리스트가 될 수 잊고 나는 마침내 딕셔너리의 값이 다음 문자열이 아닌 경우 체크, 내부 재귀 적으로 이동한다는 것을 추가하고 마지막이었다 결국 속임수를 썼는지이 솔루션으로 올 수.

    처음에 나는 모든 대체하는 간단한 재귀를 사용하는 "." 유니 코드 동등한 문자 만은 값도 도트를 교체하기 것을 그것을 알아 냈다. 나는 우리가 단지 키에서 도트를 교체해야한다고 생각하고는 "만약 isinstance (입력, DICT)"경우에 따라 변경했다 그래서. 나는 마술을 할 수있는 충분 조건이 될한다고 생각하지만 난 그 DICT 값 또한 딕셔너리 또는리스트가 될 수 잊고 나는 마침내 딕셔너리의 값이 다음 문자열이 아닌 경우 체크, 내부 재귀 적으로 이동한다는 것을 추가하고 마지막이었다 결국 속임수를 썼는지이 솔루션으로 올 수.

    def remove_dots(data):
        if isinstance(data, dict):
                return {remove_dots(key): value if isinstance(value, str) else remove_dots(value) for key,value in data.iteritems()}
        elif isinstance(data, list):
                return [remove_dots(element) for element in data]
        elif isinstance(data, str):
                return data.replace('.','\u002e')
        else:                                                                                             
                return data
    
  7. ==============================

    7.직렬화의 사전 및하려고 할 때 난 단지 정말이 문제를 건너 한 기분을 상하게 점은 키 이름으로 표시 할 수있는 등. 참조를 보여주기 위해 편집.

    직렬화의 사전 및하려고 할 때 난 단지 정말이 문제를 건너 한 기분을 상하게 점은 키 이름으로 표시 할 수있는 등. 참조를 보여주기 위해 편집.

    빠른 더러운 C #을 방법 :

    using MongoDB.Bson;
    using Newtonsoft.Json.Linq;
    using System.Text.RegularExpressions;
    
    public static T Sanitize<T>(T obj)
    {
          var str = JObject.FromObject(obj).ToJson();
          var parsed = Regex.Replace(str, @"\.(?=[^""]*"":)", "_");   //i.e. replace dot with underscore when found as a json property name { "property.name": "don't.care.what.the.value.is" }
          return JObject.Parse(parsed).ToObject<T>();
    }
    
  8. from https://stackoverflow.com/questions/8429318/how-to-use-dot-in-field-name by cc-by-sa and MIT license