Поиск MongoDB возвращает пустой массив, только когда нет данных

#mongodb #express #mongoose #aggregate #lookup

#mongodb #экспресс #mongoose #агрегировать #поиск

Вопрос:

 let CommentsList = Comment.aggregate()
        .lookup({
            from: "users",
            localField: "user",
            foreignField: "sid",
            as: "userInfo"
        })
        .unwind("$userInfo")
        .addFields({
            "comId": { "$toString": "$_id"}
        })
        .lookup({
            from: "alt_comments",
            localField: "comId",
            foreignField: "commentId",
            as: "altComments"
        })
        .unwind("$altComments")
        .group({
            "_id": "$_id",
            "username": { "$first": "$userInfo.username" },
            "avatar": { "$first": "$userInfo.avatar" },
            "content": { "$first": "$comment" },
            "likeCount": { "$first": "$likeCount" },
            "likedUsers": { "$first": "$likedUsers" },
            "unlikeCount": { "$first": "$unlikeCount" },
            "unlikedUsers": { "$first": "$unlikedUsers" },
            "avgCount": { "$first": "$avgCount" },
            "type": { "$first": "$type" },
            "slug": { "$first": "$slug" },
            "sendDate": { "$first": "$sendDate" },
            "starter": { "$first": "$user" },
            "altComments": { "$push": "$altComments"}
        })
        .match({"slug": req.query.slug, "type": req.query.type})
        .sort({ sendDate: -1 })
        .skip(10 * req.query.page)
        .limit(10);
 

У меня есть этот код. Что не так с этим кодом;

  • Если altComments пуст, то возвращает пустой массив, даже если есть данные. Если я добавлю данные alt-комментария к любому комментарию, тогда ответ будет правильным.

Как я могу это решить? Что я делаю не так?

Ответ №1:

Причина $unwind в том. Отменить поведение preserveNullAndEmptyArrays is по умолчанию false . Короче говоря, это означает, что если массив пуст или равен нулю, удалите документ при деконструкции. Если вам не нужно удалять, вы можете сделать это как true . Поэтому, когда в вашем массиве нет ни одного элемента, документ удаляется. Это вы, вы получаете пустой массив

$Unwind документация