Я пытаюсь написать сводный запрос, используя $ unwind независимо от того, является ли элемент массивом или нет. Я знаю, что $unwind
не работает ни в каких элементах массива, но мне интересно, есть ли способ заставить его работать, например, преобразовать этот элемент в массив.mongodb aggregate unind array и no array
У меня есть коллекции, как это:
{
{"x" : 1, "y" : {"c" : 2, "i" : 3}},
{"x" : 1, "y" : [{"c" : 4, "i" : 5}, {"c" : 6, "i" : 7}]}
}
Перед тем, как $unwind
я думаю, что мне нужно что-то вроде этого:
{
{"x" : 1, "y" : [{"c" : 2, "i" : 3}]},
{"x" : 1, "y" : [{"c" : 4, "i" : 5}, {"c" : 6, "i" : 7}]}
}
До сих пор в $project
этапе я могу проверить, если элемент массива или нет , но я не знаю, как использовать эту информацию для создания массива или нет. Я знаю, что могу использовать $push
для создания массива, но как оставить нетронутые элементы массивов и просто $push
нет элементов массива?
Я попытался это:
{$group : {"_id" : "$x", "myArray" : {$push : {$cond : {if : "$isArray", then : "$y", else : ["$y"]}}}}}
С кодом выше я попытался иметь все элементы в том же уровне, но не работает, так как ["$y"]
возвращается точно, что (["$y"])
, нет оценки, просто массив со строкой в Это.
Я не хочу, чтобы $ разматывать пустой массив, я хочу преобразовать элемент non array в элемент массива, чтобы я мог развернуть.
любая помощь будет оценена по достоинству.
Я не понимаю ваши комментарии об изменении образца в одно и то же. Первый образец содержит элементы массива и не-массива для «y», второй - то, что я сказал, со всеми «y» элементами в виде массивов. О возможном дублировании, я думаю, что это не мое дело, так как у меня нет и пустого массива. У меня есть элемент non array, который я хочу включить, и массив, чтобы я мог развернуть. –
Я согласен, что это не очень хорошая идея, но я не писал эту коллекцию, и изменить ее сейчас не вариант. –