Я пытаюсь создать конвейер агрегации, который отфильтровывает документы с использованием условия AND(OR(AND)
.
Мне нужно что-то вроде
if (A == "A" && B == "B" && (C == NULL || (C != NULL && C == "C")))
Мой запрос выглядит следующим образом.
Внутренняя часть:
var x = new BsonDocument
{
{
"$or",
new BsonArray
{
new BsonDocument {{"C", BsonNull.Value}},
new BsonDocument
{
{
"$and",
new BsonArray
{
new BsonDocument
{
{
"C",
new BsonDocument {{"$ne", BsonNull.Value}}
}
},
new BsonDocument {{"C", C}}
}
}
}
}
}
};
Тогда полный фильтр
var filter = new BsonDocument
{
{
"$and",
new BsonArray
{
new BsonDocument {{"A", A}},
new BsonDocument {{"B", B}},
x
}
}
};
Затем я называю это так:
var y = await collection.Aggregate().Match(filter).ToListAsync();
Однако он не возвращает никаких результатов, хотя должен.
В моем отладчике окончательный Bson выглядит так:
{
{
"$and": [
{
"A": "A"
},
{
"B": "B"
},
{
"$or": [
{
"C": null
},
{
"$and": [
{
"C": {
"$ne": null
}
},
{
"C": "C"
}
]
}
]
}
]
}
}
collection.Aggregate().Match("{ json_string }").ToListAsync()
. нет необходимости засорять код С# всеми этими битамиnew BsonDocument
. 10.12.2020