У меня проблема с переписыванием запроса Mongo в код C # (с использованием драйвера mongo c # v 2.7.0).
Модель базы данных (упрощенная версия):
{
"_id" : {
"DateTime" : ISODate(""),
"Ticks" : NumberLong(0)
},
"CH" : NumberLong(0),
"O" : {
"U" : [
{
"L" : 2
},
{
"L" : 3
}
]
}
}
Запрос mongo:
db.getCollection('collection').aggregate([
{$match: { _id: { $gte: { DateTime :ISODate(""), Ticks: 0 }, $lte: { DateTime: ISODate(""), Ticks: 0 } }}},
{$project: {
"O.U": {
$filter: {
input: "$O.U",
as: "item",
cond: { $lte: [ "$$item.L" , 2 ] }
}
},
"CH" : 1,
"O.U" : 1}
}
]
)
Это отлично работает (запускается из оболочки Robo3T) - не вернет массив "OU", если есть только элементы с "OUL"> 2.
Безчто указано "OU": 1 будет возвращено "OU": null что я не хочу:
{
"_id" : {
"DateTime" : ISODate(""),
"Ticks" : NumberLong(0)
},
"CH" : NumberLong(0),
"O" : {
"U" : null
}
}
что я хочу:
{
"_id" : {
"DateTime" : ISODate(""),
"Ticks" : NumberLong(0)
},
"CH" : NumberLong(0)
}
Я хотел добиться того же поведения с кодом C #, как вы можете видеть ниже ...
Монго запрос переписан на C #:
var aggregationPipeline = new EmptyPipelineDefinition<BsonDocument>()
.Match(match)
.Project(new BsonDocument
{
{"_id", 1},
{"CH", 1},
{
"O.U", new BsonDocument("$filter", new BsonDocument
{
{"input", "$O.U"},
{"as", "item"},
{
"cond", new BsonDocument("$lte", new BsonArray {"$$item.L", 2})
}
})
},
{"O.U", 1}
})
.As<BsonDocument, BsonDocument, MyClass>();
Этот код будет выдаватьисключение "Повторяющееся имя элемента" OU "" .
Без этого {"OU", 1} будет десериализовано BsonDocument в MyClass с MyClass.O! = null и MyClass.OU == null.
Я хочу получить MyClass.O == null.
Как это сделать без дополнительного согласования / фильтрации конвейера?Мне не хватает какой-то синтаксической функции?
Спасибо