MongoDB - Не проецировать нулевой массив после использования $ filter - PullRequest
0 голосов
/ 26 февраля 2019

У меня проблема с переписыванием запроса 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.

Как это сделать без дополнительного согласования / фильтрации конвейера?Мне не хватает какой-то синтаксической функции?

Спасибо

...