$ sum поле в массиве - запрос, который приводит документы выше определенного значения - PullRequest
2 голосов
/ 29 февраля 2020

Я создал следующую схему:

const videoSchema = createSchema(
    link: Type.string({required: true}),  
    description: Type.string({required: true}),
    answers: Type.array({required: true}).of({
         text: Type.string(), 
         likes: Type.number()
    })
);
export const videoModel = typedModel('video', videoSchema);

Теперь я хочу написать запрос, в котором есть только видео с более чем 200 лайками. Я пытался работать с .aggregate, $reduce и $sum, но не могу заставить его работать.

Кто-нибудь знает, как этого добиться? Заранее спасибо!

1 Ответ

1 голос
/ 29 февраля 2020

Вы можете попробовать запрос ниже:

db.collection.aggregate([
/** Add a field which holds count of likes for all answers for a video */
{
    $addFields: {
        likesCount: {
            $reduce: {
                input: "$answers.likes",
                initialValue: 0,
                in: {
                    $add: [
                        "$$value",
                        "$$this"
                    ]
                }
            }
        }
    }
},
/** filter to retain videos whose likes > 200 */
{
    $match: {
        likesCount: {
            $gt: 200
        }
    }
},
/** Remove additional field from documents */
{
    $project: {
        likesCount: 0
    }
  }
])

Тест: MongoDB-Playground

...