1

我在 MongoDB 中的文档结构如下:

{ _id : 1, tokens : [ "one","two","three","four","five","six","seven" ] }
{ _id : 2, tokens : [ "two","three","four","one","one","five","eight" ] }
{ _id : 3, tokens : [ "six","three","four","five","one","five","nine" ] }

平均而言,文档包含长度为 4500 项的令牌数组。

我需要进行某种模式匹配,其中我有完全匹配的标记数组,即假设我必须以完全匹配的顺序找到以下内容......

["three","four","five"]

...我希望我的查询向我提供以下文件...

{ _id : 1, tokens : [ "one","two","three","four","five","six","seven" ] }
{ _id : 3, tokens : [ "six","three","four","five","one","five","nine" ] }

即两个文档都包含我在我的数组中搜索的项目的确切顺序。

我搜索的数组可能有不同的长度,范围从 1 到 15 个标记。

我正在寻找以下内容:

  • 这对 MongoDB 查询可行吗?我已经阅读并重新阅读并重新阅读了相当不错的文档,但找不到解决方案,例如使用 $all。
  • 有没有更好的方法来存储这样的令牌来完成我需要的事情?

谢谢你的帮助。

4

1 回答 1

0

这会很慢,但你可以通过$where操作员来完成;将其与操作员配对$all以帮助提高性能。

db.test.find({
    tokens: {$all: ["three","four","five"]},
    $where: function() {
        var ix = -1;
        // Find each occurrence of 'three' in this doc's tokens array and return
        // true if it's followed by 'four' and 'five'.
        do {
            ix = this.tokens.indexOf('three', ix + 1);
            if (ix !== -1 && ix+2 < this.tokens.length && 
                this.tokens[ix+1] === 'four' && this.tokens[ix+2] === 'five') {
                return true;
            }
        } while (ix !== -1);
        return false;
    }
})
于 2013-01-04T00:47:01.803 回答