#mongodb #aggregation-framework #mongodb-.net-driver
#mongodb #структура агрегации #mongodb-.net-driver
Вопрос:
У меня есть коллекция документов, похожих на это:
{
Name : "Name1",
Product : 1012,
Titles : [ {
Id: 5,
Title: "FirstTitle"
},
{
Id: 75,
Title: "SecondTitle"
}
},
{
Name : "Name1",
Product : 2014,
Titles : [ {
Id: 5,
Title: "FirstTitle"
},
{
Id: 75,
Title: "SecondTitle"
}
}
Я сопоставляю по имени с агрегатом, чтобы получить все документы с одинаковым именем. Затем, если все совпадения имеют одинаковый набор заголовков, я хочу этот набор.
{
Name : "Name1,
TitlesVaries : false
Titles : [ {
Id: 5,
Title: "FirstTitle"
},
{
Id: 75,
Title: "SecondTitle"
}
}
Если они разные, я хочу это знать.
{
Name : "Name1"
TitlesVaries : true
Titles : null
}
У меня возникли проблемы с сравнением заголовков наборов / массивов для каждого документа, чтобы увидеть, все ли они одинаковы после того, как у меня нет моего агрегата / совпадения. Некоторые документы могут иметь пустые / нулевые массивы заголовков, и если все они пустые / нулевые, это совпадение
Комментарии:
1. Поможет ли вам ответ?
Ответ №1:
Объединение может быть
$addToSet
помогает удалять дубликаты. Итак, у нас будет два массива, которые представляют собой Set (Titles
) и исходный массив (‘original’)- Сравните оба массива. Если оба не равны, то существует различное.
Сценарий
db.collection.aggregate([
{
$group: {
_id: "$Name",
Titles: { $addToSet: "$Titles" },
original: { $push: "$Titles" }
}
},
{
$project: {
Titles: {
$cond: [
{
$or: [
{
$ne: [
{ $size: "$Titles" },
{ $size: "$original" }
]
},
{
$eq: [ { $size: "$original" }, 1 ]
}
]
},
"$Titles",
null
]
},
TitlesVaries: {
$ne: [
{ $size: "$Titles" }, { $size: "$original" }
]
}
}
}
])
Рабочая игровая площадка Mongo