查询匹配连续数组元素的文档

Posted

技术标签:

【中文标题】查询匹配连续数组元素的文档【英文标题】:Query for documents where match contiguous array elements 【发布时间】:2021-03-18 18:26:46 【问题描述】:

我有一个 MongoDB 集合,其中包含以下格式的文档:

     "_id" : 1, "tokens": [ "I", "have", "a", "dream" ] ,
     "_id" : 2, "tokens": [ "dream", "a", "little", "dream" ] ,
     "_id" : 3, "tokens": [ "dream", "a", "dream" ] ,
     "_id" : 4, "tokens": [ "a" , "little", "dream" ] ,
    ...

我需要获取所有“令牌”包含连续数组元素的文件:“a”、“dream”。 因此,以下是匹配的文件:

     "_id" : 1, "tokens": [ "I", "have", "a", "dream" ] ,
     "_id" : 3, "tokens": [ "dream", "a", "dream" ] ,

有没有办法得到正确的结果?

【问题讨论】:

【参考方案1】:

使用正则表达式的技巧。

$match 获取所有具有$all 数组输入的文档 $addFields 复制令牌和输入数组 $reduce 有助于连接所有加入 - 的字符串 $regexMatch 匹配两个字符串 $match 消除不需要的数据 $project 仅获取必要的字段

代码是

[
    $match: 
        tokens:  $all: ["a", "dream"] 
    
, 
    $addFields: 
        duplicate: "$tokens",
        inputData: ["a", "dream"]
    
, 
    $addFields: 
        duplicate: 
            $reduce: 
                input: "$duplicate",
                initialValue: "",
                in:  $concat: ["$$value", "-", "$$this"] 
            
        ,
        inputData: 
            $reduce: 
                input: "$inputData",
                initialValue: "",
                in:  $concat: ["$$value", "-", "$$this"] 
            
        
    
, 
    $addFields: 
        match: 
            $regexMatch:  input: "$duplicate", regex: '$inputData' 
        
    
, 
    $match: 
        match: true
    
, 
    $project:   _id: 1,  tokens: 1 
]

工作Mongo playground

注意:请检查多个场景,尽管它适用于这种场景

【讨论】:

以上是关于查询匹配连续数组元素的文档的主要内容,如果未能解决你的问题,请参考以下文章

链表队列栈

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档

如何选择与过滤器匹配的连续元素

在Java中查询具有完全匹配字段MongoDB的数组元素

如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?

连续子数组的最大和问题