Как десериализовать запрос со значением LUUID в BsonDocument - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь десериализовать фильтр с LUUID (или NUUID в этом примере) в BsonDocument:

var tmpQry = "{'ValueId': NUUID('ca7ac84f-18bf-42f0-b028-333ed144c549')";
var tmpBson = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(tmpQry);

и получаю ошибку:

System.FormatException: 'JSON reader was expecting a value but found 'NUUID'.'

Я понимаю, что LUUID недопустимо для JSON, но возможно ли каким-то образом получить BsonDocument из моей строки?

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

db.getCollection('my_db').aggregate([
    {
        $match: {
            'Event.key_attributes': {
                $all: [
                    { '$elemMatch': { 'Type.Code': 'code1', 'ValueId': LUUID('00000000-0000-0000-0000-000000000001') } },
                    { '$elemMatch': { 'Type.Code': 'code2', 'ValueId': LUUID("00000000-0000-0000-0000-000000000002") } },
                    { '$elemMatch': { 'Type.Code': 'code3', 'ValueId': LUUID("00000000-0000-0000-0000-000000000003") } }
                ]
            }
        }
    },
    {
        $group: {
            '_id': '$$CURRENT.Event.type._id',
            'code': { '$last': '$$CURRENT.Event.type.Code' },
            'value': { '$sum': '$$CURRENT.Event.value' }
        }
    }
]);

, и я даже не могу десериализовать его в BsonDocument. У моей проблемы есть какое-нибудь решение? Большое спасибо.

1 Ответ

0 голосов
/ 31 марта 2020

Наконец-то я решил эту проблему. Вместо того чтобы пытаться сериализовать запрос из строки, я создал конвейер BsonDocument:

var filter = new BsonDocument {{
    "$match", new BsonDocument {{
        "Event.key_attributes", new BsonDocument {{
        "$all", new BsonArray().AddRange(limit.KeyAttributes.Select(ka => new BsonDocument(
            "$elemMatch", new BsonDocument().AddRange(new List<BsonElement>{
            new BsonElement("Type.Code", ka.Type.Code),
            new BsonElement("ValueId", ka.ValueId)
            })
        )).ToList())
        }}
    }}
}};


var group = new BsonDocument {{
    "$group", new BsonDocument().AddRange(new List<BsonElement>{
        new BsonElement("_id", "$$CURRENT.Event.type._id"),
        new BsonElement("code", new BsonDocument{{
            "$last", "$$CURRENT.Event.type.Code" }}),
        new BsonElement("value", new BsonDocument{{
            "$sum", "$$CURRENT.Event.value" }})
    })
}};

var pipeline = new BsonDocument[]
{
    filter,
    group
};

var result = collection.Aggregate<MyOutputClass>(pipeline).ToListAsync();

Не было проблем с Guid.

...