MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB намира поддокумент и сортира резултатите

Както отбелязах, надявам се вашите документи наистина да имат масив, но ако $elemMatch работи за вас, тогава трябва.

Във всеки случай не можете да сортирате по елемент в масив с помощта на find. Но има случай, в който можете да направите това с помощта на .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"
    }}
])

Така че по същество, след извършване на $match условие за документи, които съдържат съответното съвпадение, след това използвате $проект "съхранявайте" оригиналния документ в _id поле и $unwind "копие" на масива "entities".

Следващият $match "филтрира" съдържанието на масива само до тези, които са подходящи. След това прилагате $sort към „съвпадащите“ документи.

Тъй като „оригиналният“ документ беше съхранен под _id , използвате $project за „възстановяване“ на структурата, с която документът всъщност трябваше да започне.

Това е начинът, по който "сортирате" вашия съвпадащ елемент от масив.

Имайте предвид, че ако сте имали множество „съвпадения“ в рамките на масив за родителски документ, тогава ще трябва да използвате допълнителен $group етап, за да получите $max стойност за полето "уместност", за да завършите сортирането си.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Използване на MongoDB $pull за изтриване на документи в масив

  2. Mongoose VersionError:Не е намерен съответстващ документ за id, когато документът се записва

  3. Как да увелича стойност на число в Mongoose?

  4. Заместващ знак за точкова нотация на Mongodb?

  5. Разбиране на издръжливостта и безопасността при запис в MongoDB