Soru Alan adında nokta nasıl kullanılır?


Alan adında nokta nasıl kullanılır?

Örnekte hatayı görüyorum:

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

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

25
2017-12-08 10:13


Menşei


Ne dersin "a\.a"? - Tomasz Nurkiewicz
"a\.a" hiçbir fark yaratmıyor gibi görünüyor. Dize hala olarak değerlendirilir "a.a" - codr


Cevaplar:


Alan adınızın nokta sembollerini Unicode eşdeğerine \uff0E

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

Daha fazla gör:

  1. http://docs.mongodb.org/manual/faq/developers/#faq-dollar-sign-escaping
  2. http://docs.mongodb.org/manual/core/document/#dot-notation

46
2018-05-15 17:25



Bu dönem için unicode'un "\ u002e" olduğunu düşündüm. - William
@William, önerdiğiniz saf unicode karakterini kullanırsanız, bir ASCII dönemine dönüşür - bunu belirtmenin süslü bir yolu olur. \ uFFOE bir "FULLWIDTH FULL STOP" karakteridir ve ASCII olmayan bir karakter yok sayılır. A \ u2024 "BİR DOT LİDERİ" karakteri, normal periyotta olduğu gibi kendi alanı içinde merkezlenmiş olduğundan daha iyi görünebilir. [Sadece Apple ürünlerinde, 2024 karakterinin daha iyi göründüğünü doğruladım - aynen gerçek bir dönem gibi.] - David H
'\ U002e' kullanarak büyük nokta, nesne anahtarını başarıyla kodladı. Ancak elde etmek hantaldır: doc [unescape ('field \ u002ename')] benim için çalışmıyor. unescape'i ayrı bir değişkende yapmanız ve sonra buna göre almanız gerekir. Mongo Db Driver'a karşı mücadelede zorluk yaşatmayı ve kaydetmeyi tercih ederim. - Matthew Chen
Bu hızlı ve kirli bir C # yöntemidir, ama bunun için çok fazla zaman harcadım ve bir çok şeyleri önemsemeye son verdim. Yorum kutusuna kod yapıştırılamıyor, bu yüzden bir cevap ekleyeceğiz ... bağlantı - darksider474


Aslında sorgularda nokta kullanabilirsiniz. Görmek: http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29

Bu özel nokta simgesi nedeniyle, alan adlarında kullanamazsınız. Tıpkı çoğu programlama dillerindeki tanımlayıcılarda nokta sembolünü kullanamazsınız.

Sorgu yazabilirsiniz db.test2.find({ "a.a" : "b" }) ancak böyle bir sorgu yazabilmek istiyorsanız, nesneyi şöyle eklemelisiniz: db.test2.insert({"a": {"a": "b"}}). Bu alan adında bir belge oluşturacak "a" Adlandırılmış alanı içeren gömülü belgenin değeri ile "a" (tekrar) değeriyle "b".


4
2017-12-09 14:44



Anlamadım - bu, birine "Noktaları kullanan MongoDB'de nasıl bir sorgu yazabilirim?" Diye soran bir cevap gibi görünüyor. "Alan adında noktaları nasıl kullanırım?" (ya da soru-yazarın açıkça ifade ettiği gibi, "Alan isminde noktalar olan bir alanı nasıl sorgulayabilirim?") Bu cevabın amacı nedir? - Offlein
İlgilendiğiniz cevabın ana bölümünü @Offlein you cannot use it in field names - lig
Teşekkür ederim, ama (bu yorumu yayınladıktan sonra öğrendiğim gibi), uygulamada bir kısıtlama uygulamak için Mongo sürücüsüne geldiğinden ve tüm sürücüler bunu yapmadığından, alan adlarında kullanmak kesinlikle mümkün. Bunu ilk elden buldum. ... Bu yüzden, bende noktalar ile alan adları var. Cevabınızı tuhaf ve sinir bozucu buldum çünkü öncelikle bunun sorulmadığı bir soruya cevap verdiğini ve alan adlarının noktalara sahip olamayacağı yönündeki iddianız deneyimlerime karşıydı. - Offlein


Ayrıca yazabilirsiniz SONManipulator mongodb'a giden ve çıkan verileri dönüştüren pymongo kütüphanesini kullanarak. Downsides vardır; bir performans isabeti var (çarpım kullanım durumunuza bağlıdır) ve bulduklarınızı kullanarak arama yaptığınızda anahtarlarınızı dönüştürmelisiniz.

Burada, KeyTransform sınıfı için yorumda nasıl kullanılacağı ile ilgili bir kod bulunmaktadır:

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

3
2017-12-20 07:56





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

Bu özyinelemeli yöntem, tüm nokta karakterlerini bir dict'ın tuşlarıyla değiştirir. \ uff0E tarafından önerildiği gibi Fisk


0
2018-02-02 15:08



Kullanmalısınız: isinstance (date [key], dict) - Jamie Ivanov
for döngüsü zaten mevcut anahtarlar listesini kullanır, ben kontrol varsa başka bir koymak gerektiğini düşünmüyorum - tuku


JsonObject'e eklemeden önce myString.replace (".", "\ U2024") kullanarak anahtar değerini değiştirdim.


0
2018-04-29 07:42





Başlangıçta tüm "." Yerine basit bir tekrarlama kullandım. Unicode eşdeğeri ile karakterleri ancak değerlerdeki noktaların bile değiştirildiğini anladı. Bu yüzden noktaları sadece anahtarlardan değiştirmemiz gerektiğini düşündük ve “isinstance (input, dict)” durumunda duruma göre değişiklikleri yaptık. Ben sihir yapmak için yeterli bir koşul olması gerektiğini düşündüm ama bu dict değerinin de bir dict veya bir liste olabileceğini unutmuşum ve nihayet ekledim ki, bir dict değeri o zaman dize değilse, tekrar tekrar içeri girip sonunda sonunda bu hile yaptı bu çözüm ile gelmek mümkün.

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

0
2018-02-17 07:46



Değişkeninize veri denir, çünkü 'giriş' ile 'veri' değiştirin. Ayrıca, 'input' kullanmak zayıf form olan input () işlevini gölgeler. Değerleri yalnızca anahtarlar içinde nesne seçimi için gereken süreler olarak değiştirmeniz gerekir. - Jamie Ivanov


Sözlükler serileştirilmeye çalışılırken bu soruna gerçekten rastladım ve böyle bir durumda kusurlu nokta önemli bir ad olarak görünebilir. Referansları göstermek için düzenlenmiştir.

Hızlı ve kirli C # yaklaşımı:

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

0
2018-02-12 08:08