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

MongoDB znajduje poddokument i sortuje wyniki

Jak wspomniałem, mam nadzieję, że twoje dokumenty rzeczywiście mają tablicę, ale jeśli $elemMatch działa dla ciebie, to powinny.

W każdym razie nie można sortować według elementu w tablicy za pomocą funkcji find. Ale jest przypadek, w którym możesz to zrobić za pomocą .aggregate() :

db.collection.aggregate([

    // Match the documents that you want, containing the array
    { "$match": {
        "nlp.entities": {
            "$elemMatch": { 
                "text": "Neelie Kroes", 
                "type": "Person"   
            }
        }
    }},

    // Project to "store" the whole document for later, duplicating the array
    { "$project": {
        "_id": {
            "_id": "$_id",
            "url": "$url",
            "nlp": "$nlp"          
        },
        "entities": "$nlp.entities"
    }},

    // Unwind the array to de-normalize
    { "$unwind": "$entities" },

    // Match "only" the relevant entities
    { "$match": {
        "entities.text": "Neelie Kroes", 
        "entities.type": "Person"   
    }},

    // Sort on the relevance
    { "$sort": { "entities.relevance": -1 } },

    // Restore the original document form
    { "$project": {
        "_id": "$_id._id",
        "url": "$_id.url",
        "nlp": "$_id.nlp"
    }}
])

Zasadniczo po wykonaniu $match warunek dla dokumentów, które zawierały odpowiednie dopasowanie, następnie użyj $projekt "przechowaj" oryginalny dokument w _id pole i $unwind „kopia” tablicy „entities”.

Następny $match "filtruje" zawartość tablicy tylko do tych, które są istotne. Następnie zastosuj $sort do "dopasowanych" dokumentów.

Ponieważ „oryginalny” dokument był przechowywany pod _id , używasz $project aby "przywrócić" strukturę, od której dokument faktycznie miał się zaczynać.

W ten sposób „sortujesz” według dopasowanego elementu tablicy.

Pamiętaj, że jeśli miałeś wiele "dopasowań" w tablicy dla dokumentu nadrzędnego, wtedy musiałbyś użyć dodatkowego $grupa etap, aby uzyskać wartość $max dla pola „trafność”, aby zakończyć sortowanie.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zarządzanie wieloma technologiami baz danych za pomocą ClusterControl

  2. Fragment MongoDB według daty na jednej maszynie

  3. Jak działa parametr arrayFilters w MongoDB

  4. Katalog główny Mongodb monogorestore musi być zrzutem pojedynczej bazy danych

  5. Test jednostkowy z Mongoose