MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Driver C# MongoDB:impossibile trovare il modo per eseguire query complesse per il filtro AnyIn in MongoDB

non farlo :)

Un punto da cui puoi iniziare è qui . Descrive tutti gli operatori LINQ supportati dal driver MongoDB .NET. Come puoi vedere .Contains() non è menzionato lì, il che significa che non puoi usarlo e riceverai un errore nel runtime, ma non significa che non c'è modo di fare ciò che stai cercando di ottenere.

L'operatore più vicino a contiene che puoi utilizzare è $indexOfBytes che restituisce -1 se non c'è corrispondenza e la posizione di una sottostringa in caso contrario. Inoltre, poiché è necessario confrontare un array con un altro array, sono necessarie due coppie di $mappa e $anyElementTrue per fare esattamente ciò che è .Any di .NET fa.

La tua query (client MongoDB) può assomigliare a questa:

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" ] } ] }
                        }
                    }
                }
            }
        }
    }
})

Parco giochi Mongo ,

Puoi eseguire la stessa query da .NET usando BsonDocument classe che accetta una stringa (JSON) e la converte in una query:

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();