Используя C# MongoDB для преобразования Int в String? - PullRequest
1 голос
/ 19 января 2020

Я использую C# MongoDb.Driver (2.10), чтобы получить документ из коллекции:

MongoClient dbClient = new 
MongoClient("mongodb://***");
IMongoDatabase db = dbClient.GetDatabase("***");
var collection = db.GetCollection<BsonDocument>("***");
Console.WriteLine( collection.Find(Builders<BsonDocument>.Filter.Empty).First());

Это работает и выдает следующее:

enter image description here

Так что все в порядке.

Но теперь я хочу попробовать отфильтровать, где lockPolicyId.ToString()=="1". ( В виде строки, а не в виде числа )

Итак, я попробовал:

var filter= Builders<BsonDocument>.Filter.Where(a=>a["lockPolicyId"].AsString=="1");
var t=collection.Find( filter ).First() ;
Console.Writeline(t);

Что показывает эту ошибку:

Операнды для оператора 'Равные' не соответствуют параметрам метода 'op_Equality'.

Я также пытался:

 var filter= Builders<BsonDocument>.Filter.Where(a=>a["lockPolicyId"].ToString()=="1");

И получил эту ошибку:

{document} {lockPolicyId} .ToString () не поддерживается.

Теперь я понимаю, почему это происходит (Int, а не String).

Но все же

Вопрос:

Как я могу фильтровать по значению ToString?

Другими словами, чтобы эта строка работала:

Builders<BsonDocument>.Filter.Where(a=>a["lockPolicyId"].AsString=="1")

1 Ответ

1 голос
/ 19 января 2020

Невозможно.

MongoDB C# Драйвер интерпретирует a=>a["lockPolicyId"]==1 как {lockPolicyId: {"$eq" : "1"}}.

При попытке a=>a["lockPolicyId"].AsString=="1" его нельзя интерпретировать в синтаксис MongoDB .. . (такой запрос {{$toString:"lockPolicyId"} : "1"} недопустим) * Метод 1009 *


MongoDB .find имеет исключение с оператором $where:

db.collection.find({"$where": "this.lockPolicyId.toString() == '1'"})

Но вам нужно писать такие запросы вручную ( не может быть написано Predicate интерфейсом). Примечание: Это очень медленно

MongoDB предлагает команду aggregate для выполнения необычных запросов. Вам нужно определить конвейер запросов. Если вы используете оператор $toString на первом этапе, а затем применяете критерии соответствия на втором этапе, он будет работать:

db.collection.aggregate([
    {$addFields:{
        lockPolicyId : {$toString:"$lockPolicyId"}
    }},
    {$match:{
        lockPolicyId : "1"
    }}
])
...