MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

C# MongoDB-Treiber:Kann keine Möglichkeit finden, komplexe Abfragen für AnyIn-Filter in MongoDB auszuführen

Tu es nicht :)

Ein Ort, an dem Sie anfangen können, ist hier . Es beschreibt alle LINQ-Operatoren, die vom MongoDB .NET-Treiber unterstützt werden. Wie Sie sehen können .Contains() wird dort nicht erwähnt, was bedeutet, dass Sie es nicht verwenden können und Sie einen Fehler in der Laufzeit erhalten, aber es bedeutet nicht, dass es keine Möglichkeit gibt, das zu erreichen, was Sie erreichen möchten.

Der nächste Operator, den Sie verwenden können, ist $indexOfBytes was -1 zurückgibt wenn es keine Übereinstimmung gibt und andernfalls die Position einer Teilzeichenfolge. Da Sie außerdem ein Array mit einem anderen Array abgleichen müssen, benötigen Sie zwei Paare von $karte und $anyElementTrue um genau das zu tun, was .Any von .NET macht tut.

Ihre Abfrage (MongoDB-Client) kann so aussehen:

db.collection.find({
    $expr: {
        $anyElementTrue: {
            $map: {
                input: "$groupsAuthorized",
                as: "group",
                in: {
                    $anyElementTrue: {
                        $map: { 
                            input: ["France/IDF/Paris", "USA/NY/NYC"],
                            as: "userGroup",
                            in: { $ne: [ -1, { $indexOfBytes: [ "$$userGroup", "$$group" ] } ] }
                        }
                    }
                }
            }
        }
    }
})

Mongo-Spielplatz ,

Sie können dieselbe Abfrage in .NET mit BsonDocument ausführen Klasse, die einen String (JSON) nimmt und in eine Abfrage umwandelt:

var query = BsonDocument.Parse(@"{
    $expr: {
        $anyElementTrue:
        {
            $map:
            {
                input: '$groupsAuthorized',
                    as: 'group',
                    in: {
                    $anyElementTrue:
                    {
                        $map:
                        {
                            input: ['France/IDF/Paris', 'USA/NY/NYC'],
                                as: 'userGroup',
                                in: { $ne: [-1, { $indexOfBytes: ['$$userGroup', '$$group'] } ] }
                        }
                    }
                }
            }
        }
    }
}");

var result = col.Find(query).ToList();