2016-07-13 7 views
2

Ich habe eine Suchabfrage, wo ich überprüfen muss, ob Elemente in einem Array auf Dokumenten sind. Ich möchte die Größe der Arrays indizieren, um die Abfrage zu optimieren, aber ich bin mir nicht sicher, wie man einen solchen Index erstellt.Wie erstellt man einen Index für Array-Länge in MongoDB?

Ich habe die Filter durch die MongoDB C# Treiber erstellt:

{ 
    "_id" : ObjectId("577a271f2b365917c4d72678"), 
    "UserId" : ObjectId("577a26a32b365917c4d67e42"), 
    "Category" : NumberInt(4), 
    "Details" : { 
     "_id" : ObjectId("577a271f2b365917c4d72677"), 
     "References" : [ 
      { 
       "RefId" : ObjectId("577a887b4fd1ae0e1c7b2035"), 
       "Order" : NumberInt(0), 
       "RefType" : NumberInt(1) 
      } 
     ] 
    }, 
    "Modified" : ISODate("2016-07-05T01:26:33.549+0000"), 
    "IsActive" : true 
} 

Die Abfrage sieht wie folgt aus:

{ 
    "query" : { 
        "find" : "post", 
        "filter" : { 
            "UserId" : { 
                "$in" : [ 
                    ObjectId("577a26a12b365917c4d67dd5"), 
        ObjectId("577a26a12b365917c4d67dd3") 
                ] 
            }, 
            "IsActive" : true, 
            "$or" : [ 
                { 
                    "Category" : NumberInt(4), 
                    "UserId" : { 
                        "$nin" : [ 

                        ] 
                    }, 
                    "Details.References.0" : { 
                        "$exists" : true 
                    } 
                }, 
                { 
                    "Category" : { 
                        "$ne" : NumberInt(4) 
                    } 
                } 
            ], 
            "Modified" : { 
                "$lt" : ISODate("2016-07-04T13:59:32.094+0000") 
            } 
        }, 
        "sort" : { 
            "Modified" : NumberInt(-1) 
        }, 
        "limit" : NumberInt(10) 
    }, 
    "time" : NumberInt(33), 
    "docsScanned" : NumberInt(1125) 
} 

Als

Builders<Post>.Filter.And(new List<FilterDefinition<Post>>() 
{ 
    Builders<Post>.Filter.Eq(x => x.Category, Category.COLLECTION), 
    Builders<Post>.Filter.SizeGt(x => x.Details.References, 0) 
}) 

Der Dokumenttyp wie folgt aussieht Sie können sehen, dass es einige Dokumente scannt (1125), um die richtigen zu finden. Ich mag diese Zahl weiter reduzieren, aber ich bin nicht sicher, wie dieser Teil zu indizieren:

"Details.References.0" : { 
    "$exists" : true 
} 

Wie erstelle ich einen Index für die Länge von Referenzen?

Antwort

2

Mongo-Indizes bieten noch keine solche Funktion.

Um die Größe eines Arrays zu speichern, können Sie FeldArraySize verwenden und es bei jeder Änderung dieses Arrays manuell aktualisieren. Erstellen Sie dann einen Feldindex für arraySize.

Verwandte Themen