【问题标题】:How to find a document with an array of strings based on if it has items in common with a reference array of string?如何根据字符串的引用数组是否有共同的项目来查找包含字符串数组的文档?
【发布时间】:2021-05-22 08:56:38
【问题描述】:

给定一个字符串的引用数组:["Comedy", "Horror", "Romance"], 我想用这个模式查询Movie 模型:

const MovieSchema = new Schema({
    _id: {
        type: Types.ObjectId,
        required: true
    },
    title: {
        type: String,
        required: true
    },
    categories: [{ type: String }],
});

这样,我将获得Movies 的结果,其中包含与参考数组相同的类别,按与参考数组相同的元素数量排序。例如:

[
    {
        _id: "57",
        title: "Sample Movie A",
        categories: ["Comedy", "Horror", "Romance", "Family"]
    },
    {
        _id: "92",
        title: "Sample Movie B",
        categories: ["Comedy", "Romance", "Family", "Coming of Age"]
    }
]

请注意,电影 A 是结果中的第一个,因为它与参考数组有 3 个共同项,而电影 B 只有 2 个共同项。

如何使用 Mongoose 5.11.16 实现此查询?

【问题讨论】:

    标签: javascript node.js arrays mongodb mongoose


    【解决方案1】:

    您可以使用$setIntersection 获取匹配元素的计数,将生成的数组大小作为新字段添加到每个文档中,然后按此字段排序。

    然后您可以扩展查询以过滤计数大于 0 的匹配项,并从输出中删除 categoryCount,例如

    Movie.aggregate([
      {
        "$addFields": {
          "categoryCount": {
            $size: {
              $setIntersection: [
                [
                  "Comedy",
                  "Horror",
                  "Romance"
                ],
                "$categories"
              ]
            }
          }
        }
      },
      {
        "$match": {
          categoryCount: {
            $gt: 0
          }
        }
      },
      {
        "$sort": {
          categoryCount: -1
        }
      },
      {
        "$project": {
          categoryCount: 0
        }
      }
    ])
    

    mongoplayground 上的示例:https://mongoplayground.net/p/ZlUNfB82FRK

    【讨论】:

    • 如何使用 mongoose Mode/Schema API 来完成?
    • 只需在您的模型上调用聚合,例如Movie.aggregate([...]).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2015-09-08
    • 2021-12-14
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多