Значения обрезки, существующие в базе данных Mongo - PullRequest
1 голос
/ 30 мая 2019

Данные в моей коллекции могут иметь пробелы спереди и сзади, что я хочу сделать, это обрезать все пробелы и сделать сравнение ==, чтобы получить соответствующую запись, мой код ниже:

var test = await _dataStore.FindMostRecentAsync(x => x.Barcodes.PrimaryBarcode.Trim() == barcode.Trim());

Когда я запускаю этот код, он выдает ошибку .Trim(), которая не поддерживается (она работает только тогда, когда я обрезаю строковую переменную штрих-кода, которую я передаю.

Какой самый лучший способ обрезать данные в моей коллекции, чтобы я мог провести точное сравнение.

Трассировка стека

в MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression (Expression выражение) в MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison (Expression variableExpression, ExpressionType operatorType, ConstantExpression постоянное выражение) в MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate (Expression узел) в MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate (Expression узел, IBsonSerializerRegistry serializerRegistry) в MongoDB.Driver.MongoCollectionImpl 1.CreateFindOperation[TProjection](FilterDefinition 1 фильтр, FindOptions 2 options) at MongoDB.Driver.MongoCollectionImpl 1.FindAsync [TProjection] (IClientSessionHandle сессия, FilterDefinition 1 filter, FindOptions 2 варианта, Отмена взята Отмена взята) в MongoDB.Driver.MongoCollectionImpl 1.<>c__DisplayClass37_0 1.b__0 (IClientSessionHandle сеанс) в MongoDB.Driver.MongoCollectionImpl 1.UsingImplicitSessionAsync[TResult](Func 2 funcAsync, CancellationToken CancellationToken)

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы должны будете использовать функцию агрегирования, чтобы иметь возможность вызывать оператор trim .

К сожалению, прямого вызова через драйвер C # не существует, однако вы можете создать его, используя несколько BsonDocuments, например:

var barcode = "     1512356      ";


//This exclude the trimmedField from the result.
var projectionDefinition = Builders<BsonDocument>.Projection.Exclude("trimmedField");  
//Call the trim operator and put it in the temporary trimmedField property (this trims the barcode on the database)
var expression = new BsonDocument(new List<BsonElement>
    {
        new BsonElement("trimmedField", new BsonDocument(new BsonDocument("$trim", new BsonDocument("input", "$Barcodes.PrimaryBarcode"))))
    });

//Add the trimmedField to the document
var addFieldsStage = new BsonDocument(new BsonElement("$addFields", expression));

//Build a filter on the trimmedField and trim the local variable
var trimFilter = Builders<BsonDocument>.Filter.Eq(x => x["trimmedField"], barcode.Trim());

//Put it all together
var result = collection.Aggregate().AppendStage<BsonDocument>(addFieldsStage).Match(trimFilter).Project(projectionDefinition).As<YourType>().ToList();

Убедитесь, что в .As<T> указан правильный тип, чтобы иметь возможность разыграть сущность.

И если вы добавите [BsonIgnoreExtraElements] над своим классом, вы сможете отказаться от стадии проецирования.

0 голосов
/ 31 мая 2019

Решение, которое я нашел для этого, заключалось в следующем:

var test = await _dataStore.FindMostRecentAsync(x => x.Barcodes.PrimaryBarcode.Contains(barcode.Trim()));

Вместо того, чтобы пытаться обрезать значения, которые существовали в базе данных, я обрежу переменную, а затем сделаю Contains таким образом.получит все значения, которые соответствуют моему штрих-коду, позже с этим массивом объектов я могу пойти дальше и отфильтровать по дате или что-то еще.

Я не нашел никакого способа, которым мы можем передать в Trim () метод для объекта коллекции с использованием C # MongoDriver

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...