Mongoose - 通过部分匹配另一个数组,根据对象数组字段查找文档

时间:2018-03-29 13:18:20

标签: arrays node.js mongodb mongoose

所以,我会向我的api发送以下数组格式

['apple', 'orange', 'mango', 'kiwi', 'lemon']

在我的数据库中,我有一个名为Recipes的集合,其格式为

ingredients: [ { .., name: 'apple', .. }, { .., name: 'orange', .. }] - 是具有这种格式的对象数组

在我的数据库中包含以下文件:

文件#1

ingredients:[ {.., name: 'apple', ..}, {.., name: 'kiwi', ..}, {.., name: 'banana', ..}]

文件#2

ingredients:[ {.., name: 'apple', ..}, {.., name: 'orange', ..}, {.., name: 'kiwi', ..}]

文件#3

ingredients:[ {.., name: 'lemon', ..}, {.., name: 'tomato', ..}, {.., name: 'potato', ..}]

mongoose查询应该如何返回文档#2,文档#1,文档#3(此顺序,因为它们的数组与初始请求的数组最相似)

1 个答案:

答案 0 :(得分:0)

您可以使用以下聚合:

db.collection.aggregate([
    {
        $addFields: {
            totalMatch: {
                $size: {
                    $setIntersection: [['apple', 'orange', 'mango', 'kiwi', 'lemon'], { $map: { input: "$ingredients", as: "ingredient", in: "$$ingredient.name" } }]
                }
            }
        }
    },
    {
        $sort: {
            totalMatch: -1
        }
    },
    {
        $project: {
            totalMatch: 0
        }
    }
])

您只需要添加其他字段,该字段计算所有匹配的成分(使用$setIntersection),然后按该字段按降序排序。由于您的成分包含对象,因此您可以使用$map仅检索名称。