Dela via


Hantera indexering i Azure Cosmos DB för MongoDB vCore

GÄLLER FÖR: MongoDB vCore

Index är strukturer som förbättrar datahämtningshastigheten genom att ge snabb åtkomst till fält i en samling. De fungerar genom att skapa en ordnad uppsättning pekare till data, ofta baserat på nyckelfält. Azure Cosmos DB for MongoDB vCore använder index i flera kontexter, inklusive push-överföring av frågor, unika begränsningar och horisontell partitionering.

Viktigt!

Fältet "_id" är det enda fält som indexeras som standard och fältets maximala storlek kan vara 2 KB. Vi rekommenderar att du lägger till ytterligare index baserat på frågefilter och predikater för att optimera prestanda.

Indextyper

För enkelhetens skull bör vi överväga ett exempel på ett bloggprogram med följande konfiguration:

  • Databasnamn: cosmicworks
  • Samlingsnamn: products

Det här exempelprogrammet lagrar artiklar som dokument med följande struktur. Alla exempel som citeras använder strukturen för den här samlingen ytterligare.

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": {lastName: "Doe", firstName: "John"},
  "category": "Technology",
  "launchDate": ISODate("2024-06-24T10:08:20.000Z"),
  "published": true
}

Index för enstaka fält

Index för enskilda fält lagrar information från ett enda fält i en samling. Sorteringsordningen för det enskilda fältindexet spelar ingen roll. _id förblir indexerat som standard.

Azure Cosmos DB for MongoDB vCore har stöd för att skapa index på följande sätt

  • Dokumentfält på den översta nivån.
  • Inbäddat dokument.
  • Fält i inbäddat dokument.

Följande kommando skapar ett index för ett enda fält i fältet author och följande kommando skapar det i ett inbäddat fält firstName.

use cosmicworks

db.products.createIndex({"author": 1})

// indexing embedded property
db.products.createIndex({"author.firstName": -1})

En fråga kan använda flera index med ett enda fält där det är tillgängligt.

Anteckning

Med azure Cosmos DB for MongoDB vCore kan du skapa högst 64 index i en samling. Beroende på nivån kan vi planera en utökning på upp till 300 index på begäran.

Sammansatta index

Sammansatta index förbättrar databasens prestanda genom att tillåta effektiv frågekörning och sortering baserat på flera fält i dokument. Den här optimeringen minskar behovet av att genomsöka hela samlingar, vilket påskyndar datahämtningen och organisationen.

Följande kommando skapar ett sammansatt index för fälten author och launchDate i motsatt sorteringsordning.

use cosmicworks

db.products.createIndex({"author":1, "launchDate":-1})

Order av fält påverkar indexets selektivitet eller användning. Frågan find skulle inte använda det index som skapats.

use cosmicworks

db.products.find({"launchDate": {$gt: ISODate("2024-06-01T00:00:00.000Z")}})

Begränsningar

  • Högst 32 fält\sökvägar i ett sammansatt index.

Partiella index

Index som har ett associerat frågefilter som beskriver när en term ska genereras i indexet.

use cosmicworks

db.products.createIndex (
   { "author": 1, "launchDate": 1 },
   { partialFilterExpression: { "launchDate": { $gt: ISODate("2024-06-24T10:08:20.000Z") } } }
)

Begränsningar

  • Partiella index stöder inte ORDER BY eller UNIQUE såvida inte filtret uppfyller kraven.

Textindexer

Textindex är särskilda datastrukturer som optimerar textbaserade frågor, vilket gör dem snabbare och effektivare.

Använd metoden createIndex med text alternativet för att skapa ett textindex i fältet title .

use cosmicworks;

db.products.createIndex({ title: "text" })

Anteckning

Du kan bara definiera ett textindex per samling, men med Azure Cosmos DB for MongoDB vCore kan du skapa textindex i kombination med flera fält så att du kan utföra textsökningar i olika fält i dina dokument.

Konfigurera alternativ för textindex

Textindex i Azure Cosmos DB for MongoDB vCore har flera alternativ för att anpassa deras beteende. Du kan till exempel ange språket för textanalys, ange vikter för att prioritera vissa fält och konfigurera skiftlägesokänsliga sökningar. Här är ett exempel på hur du skapar ett textindex med alternativ:

  • Skapa ett index för att stödja sökning på både fälten title och content med stöd för engelska. Tilldela också högre vikter till title fältet för att prioritera det i sökresultaten.

    use cosmicworks
    
    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Anteckning

När en klient utför en textsökningsfråga med termen "Cosmos DB" beräknas poängen för varje dokument i samlingen baserat på förekomsten och frekvensen för termen i både fälten "title" och "content", med högre prioritet för fältet "title" på grund av dess högre vikt.

Utföra en textsökning med hjälp av ett textindex

När textindexet har skapats kan du utföra textsökningar med hjälp av textoperatorn i dina frågor. Textoperatorn tar en söksträng och matchar den mot textindexet för att hitta relevanta dokument.

  • Utför en textsökning efter frasen Cosmos DB.

    use cosmicworks
    
    db.products.find(
      { $text: { $search: "Cosmos DB" } }
    )
    
  • Du kan också använda $meta projektionsoperatorn tillsammans med fältet textScore i en fråga för att se vikten

    use cosmicworks
    
    db.products.find(
    { $text: { $search: "Cosmos DB" } },
    { score: { $meta: "textScore" } }
    )
    

Begränsningar

  • Endast ett textindex kan definieras i en samling.
  • Sorteringsåtgärder kan inte använda ordningen på textindexet i MongoDB.
  • Hint() stöds inte i kombination med en fråga med $text uttryck.
  • Textindex kan vara relativt stora och förbrukar betydande lagringsutrymme jämfört med andra indextyper.

Jokerteckenindex

Index på ett enda fält indexerar alla sökvägar under field , exklusive andra fält som är på samma nivå. Till exempel för följande exempeldokument

{
 "children":
    {
     "familyName": "Merriam",
     "pets": { "details": {“name”: "Goofy", ”age”: 3} }
   } 
}

När du skapar ett index för { "pets.$**": 1 }, skapas index för informations- och underdokumentegenskaper men skapar inte ett index för "familyName".

Begränsningar

  • Wildcard-index kan inte stödja unika index.
  • Jokerteckenindex stöder inte push-nedtryck av ORDER BY om filtret inte endast innehåller sökvägar som finns i jokertecken (eftersom de inte indexerar odefinierade element)
  • Ett sammansatt jokerteckenindex kan bara ha one jokerteckentermer och one eller fler indextermer. { "pets.$**": 1, “familyName”: 1 }

Geospatiala index

Geospatiala index stöder frågor om data som lagras som GeoJSON-objekt eller äldre koordinatpar. Du kan använda geospatiala index för att förbättra prestanda för frågor på geospatiala data eller för att köra vissa geospatiala frågor.

Azure Cosmos DB for MongoDB vCore innehåller två typer av geospatiala index:

  • 2dsphere Indexes, som stöder frågor som tolkar geometri på en sfär.
  • 2d Index, som stöder frågor som tolkar geometri på en plan yta.

2D-indexer

2d-index stöds endast med äldre koordinatparformat för lagring av geospatiala data.

createIndex Använd metoden med 2d alternativet för att skapa ett geospatialt index i fältetlocation.

db.places.createIndex({ "location": "2d"});

Begränsningar

  • Endast one platsfältet kan vara en del av indexet 2d och endast one andra icke-geospatiala fält kan ingå i indexet compound 2ddb.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1 })

2dsphere-indexer

2dsphere index stöder geospatiala frågor på en jordliknande sfär. Det kan stödja både GeoJSON-objekt eller äldre koordinatpar. 2dSphere index fungerar med GeoJSON-formatet för lagring av data, om äldre punkter påträffas konverteras de till GeoJSON-punkt.

createIndex Använd metoden med 2dsphere alternativet för att skapa ett geospatialt index i fältetlocation.

db.places.createIndex({ "location": "2dsphere"});

2dsphere index gör det möjligt att skapa index på flera geospatiala och flera icke-geospatiala datafält. db.places.createIndex({ "location": "2d", "non-geospatial-field": 1 / -1, ... "more non-geospatial-field": 1 / -1 })

Begränsningar

  • Ett sammansatt index som använder ett vanligt index och geospatialt index stöds inte. Att skapa något av de geospatiala indexen skulle leda till fel.

    // Compound Regular & 2dsphere indexes are not supported yet
    db.collection.createIndex({a: 1, b: "2dsphere"})
    
    // Compound 2d indexes are not supported yet
    db.collection.createIndex({a: "2d", b: 1})
    
  • Polygoner med hål fungerar inte. Infogning av en Polygon med hål är inte begränsad, men $geoWithin frågan misslyckas för scenarier:

    1. Om själva frågan har polygon med hål

      coll.find(
        {
            "b": {
                "$geoWithin": {
                    "$geometry": {
                        "coordinates": [
                            [
                                [ 0, 0], [0, 10], [10, 10],[10,0],[0, 0]
                            ],
                            [
                                [5, 5], [8, 5], [ 8, 8], [ 5, 8], [ 5, 5]
                            ]
                        ],
                        "type": "Polygon"
                    }
                }
            }
        })
      
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    2. Om det finns något ofiltrerat dokument som har polygon med hål.

      [mongos] test> coll.find()
        [
          {
            _id: ObjectId("667bf7560b4f1a5a5d71effa"),
            b: {
              type: 'Polygon',
              coordinates: [
                [ [ 0, 0 ], [ 0, 10 ], [ 10, 10 ], [ 10, 0 ], [ 0, 0 ] ],
                [ [ 5, 5 ], [ 8, 5 ], [ 8, 8 ], [ 5, 8 ], [ 5, 5 ] ]
              ]
            }
          }
        ]
      // MongoServerError: $geoWithin currently doesn't support polygons with holes
      
    3. key fältet är obligatoriskt när du använder geoNear.

       [mongos] test> coll.aggregate([{ $geoNear: { $near: { "type": "Point", coordinates: [0, 0] } } }])
      
       // MongoServerError: $geoNear requires a 'key' option as a String
      

Nästa steg