Проблема в том, что MongoDB может вести себя по-разному в случае наличия оператора $eq или синтаксиса {fieldName: value. См. пример здесь: https://mongoplayground.net/p/sXKR2FvE5eg
Я хочу группировать по полю groupBy и хочу, чтобы объекты типа "A" находились в поле typeA и наоборот для B.
Я использовал драйвер mongo-java, который не создает оператор $eq в случае Filter.eq используется, см. документацию.
Для typeA я использовал $eq в примере, а для typeB я использовал синтаксис, отличный от $eq. Как показывает пример, оператор $eq на самом деле фильтрует правильно, а синтаксис, отличный от $eq, нет.
Итак, вопрос в том, является ли это фактической проблемой MongoDB или Filters.eq всегда должен создавать $eq в драйвере mongo-java?
Минимальный пример:
Следующий код:
Код: Выделить всё
var typeAPush = Accumulators.push("typeA", new Document("$cond", Arrays.asList(
new Document("$eq", Arrays.asList("$type", "A")),
"$$ROOT",
"$$REMOVE"
)));
var typeBPush = Accumulators.push("typeB", new Document("$cond", Arrays.asList(
// Using Filter.eq which does not create `$eq`
Filters.eq("$type", "B"),
"$$ROOT",
"$$REMOVE"
)));
var groupStage = Aggregates.group("$groupBy",
typeAPush,
typeBPush
);
Код: Выделить всё
{
"$group": {
"_id": "$groupBy",
"typeA": {
"$push": {
"$cond": [
{
"$eq": [
"$type",
"A"
]
},
"$$ROOT",
"$$REMOVE"
]
}
},
"typeB": {
"$push": {
"$cond": [
{
"$type": "B"
},
"$$ROOT",
"$$REMOVE"
]
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ses-issues
Мобильная версия