代码之家  ›  专栏  ›  技术社区  ›  Andreea Dumitru

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

  •  0
  • Andreea Dumitru  · 技术社区  · 7 年前

    因此,我将向我的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 回复  |  直到 7 年前
        1
  •  0
  •   mickl    7 年前

    您可以使用以下聚合:

    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 仅检索名称。