MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB:Znajdź dokument o podanych wartościach pól w obiekcie z nieznanym kluczem

Chociaż wydaje się, że zbliżyłeś się do tej struktury z powodu problemu z aktualizacjami przy użyciu zagnieżdżonych tablic, tak naprawdę spowodowałeś tylko inny problem, robiąc coś innego, co nie jest tak naprawdę obsługiwane, a to znaczy, że nie ma "wildcard" koncepcja wyszukiwania nieokreślonych kluczy przy użyciu standardowych operatorów zapytań, które są optymalne.

Jedynym sposobem, w jaki naprawdę możesz wyszukać takie dane, jest użycie kodu JavaScript na serwerze do przechodzenia przez klucze za pomocą $where . To zdecydowanie nie jest dobry pomysł, ponieważ wymaga brutalnej siły oceny zamiast używania przydatnych rzeczy, takich jak indeks, ale można do niej podejść w następujący sposób:

db.theses.find(function() {
    var relations = this.relations;
    return Object.keys(relations).some(function(rel) {
        return relations[rel].type == "interpretation";
    });
))

Chociaż spowoduje to zwrócenie tych obiektów z kolekcji, które zawierają wymaganą wartość zagnieżdżoną, należy sprawdzić każdy obiekt w kolekcji w celu przeprowadzenia oceny. Dlatego taka ocena powinna być używana tylko w połączeniu z czymś, co może bezpośrednio używać indeksu zamiast twardej wartości obiektu w kolekcji.

Jeszcze lepszym rozwiązaniem jest rozważenie przemodelowania danych w celu wykorzystania indeksów w wyszukiwaniu. Tam, gdzie trzeba zaktualizować informacje o „ocenach”, w zasadzie „spłaszcz” strukturę, która zamiast tego traktuje każdy element „rating” jako jedyne dane tablicowe:

{
    "_id": "aeokejXMwGKvWzF5L",
    "text": "test",
    "relationsRatings": [
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 1,
            "ratingScore": 5
        },
        {
            "relationId": "cF6iKAkDJg5eQGsgb",
            "type": "interpretation",
            "originId": "uFEjssN2RgcrgiTjh",
            "ratingId": 2,
            "ratingScore": 6
        }
   ]
}

Teraz wyszukiwanie jest oczywiście dość proste:

db.theses.find({ "relationsRatings.type": "interpretation" })

I oczywiście pozycyjny $ operator może być teraz używany z bardziej płaską strukturą:

db.theses.update(
    { "relationsRatings.ratingId": 1 },
    { "$set": { "relationsRatings.$.ratingScore": 7 } }
)

Oczywiście oznacza to duplikację „powiązanych” danych dla każdej wartości „ocen”, ale generalnie jest to koszt aktualizacji według dopasowanej pozycji, ponieważ to wszystko, co jest obsługiwane tylko przy jednym poziomie zagnieżdżenia tablicy.

Możesz więc zmusić logikę do dopasowania jej struktury, ale nie jest to świetny pomysł i doprowadzi do problemów z wydajnością. Jeśli jednak twoją główną potrzebą jest aktualizacja informacji o "ocenach", a nie tylko dodawanie do wewnętrznej listy, bardziej płaska struktura będzie bardziej korzystna i oczywiście będzie znacznie szybsza w wyszukiwaniu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. gdzie jest domyślny katalog instalacyjny dla mongodb

  2. MongoDB Java Inserting Throws org.bson.codecs.configuration.CodecConfigurationException:Nie można znaleźć kodeka dla klasy io.github.ilkgunel.mongodb.Pojo

  3. błąd:oczekiwana definicja klasy lub obiektu

  4. Funkcja wywołania zwrotnego nigdy nie jest wywoływana po wykonaniu zapytania Mongoose

  5. MongoDB element tablicy pull z kolekcji