В Mongoose, как вы генерируете новое поле со значением, равным длине массива другого поля?

У меня есть простая база данных с коллекцией пользователей. Вот как выглядит документ:

{
   username: "Joe",
   age: 20,
   friends: ["u2", "u5", "u6", "u7", "u11"]
}

Я хочу создать запрос, который будет возвращать что-то похожее

{
   username: "Joe",
   age: 20,
   total_friends: 5,
   friends: ["u2", "u5", "u6"]
}

обратите внимание, что я нарезал только первых 3 друзей, так как я не хочу возвращать всех друзей пользователей в каждом запросе.

Как я могу создать total_friends поле перед нарезкой?

Вот что у меня так далеко:

UserModel.findById( new Types.ObjectId(userId))
             // what goes here??
            .slice('friends', 3)
            .populate('friends')
            .exec((err, doc) => {...});

1 ответ

Решение

Вы можете использовать структуру агрегации. Попробуй это:

db.userModel.aggregate([
    {
        $addFields: {
            total_friends: { $size: "$friends" },
            friends: { $slice: [ "$friends", 3 ] }
        } 
    }
])

Поскольку 5-элементный массив является входом для стадии конвейера, $size вернет 5 элементов, а $slice будет работать с 5-элементным массивом, принимая первые три.

Другие вопросы по тегам