MongoDB $where查询以获取子文档内容



下面的mongodb查询不返回文档。查询有什么问题?我想指定$where以匹配数组中的元素

[编辑] 上面的问题是我的方案的简化版本。我正在使用一个弹簧数据 mongodb 存储库。我想使用@Query注释指定查询。希望$where部分是简单的比较,而不是一个完整的JavaScript函数。类似的东西

@Query ( value=" { flag: true, $where: "this.versions.version == this.defaultVersion "}", fields = "{'versions' : 1}" )
Foo getDefaultVersion();

如果$where语法不正确,请提出替代方案。

db.foo.find({
    flag: true,
    $where: "this.versions.version == this.defaultVersion " },
    { 'versions' : 1}
});

收集:

{
    flag: true,
    defaultVersion: "1.0",
    versions: [
        {
            version: "1.0",
            tags: ["abc", "def"]
        },
        {
            version: "1.1",
            tags: ["abc", "def"]
        }
    ]
}

我想从版本数组中获取"版本"子文档,该数组将匹配版本作为默认版本属性。

[编辑2] 我能够使用$elemMatch缩小范围

db.foo.find({
    flag: true,
    versions: { $elemMatch : { version: '1.0' } } 
    },
    { 'versions' : 1}
});

在上面代替硬编码'1.0',我想指定文档的默认版本。不确定如何实现它?

在大多数情况下,

应避免使用 $where 运算符,因为它都会调用完整的集合扫描,而不管其他条件可能使用索引选择。

此外,你在每个结果文档上调用 JavaScript 解释器,这将比本机代码慢得多。阅读手册页上的警告,它们的存在是有原因的

在可能的情况下,请尝试使用.aggregate()进行此类比较。在您的情况下,这绝对是更好的选择:

db.foo.aggregate([
    { "$match": { "flag": true } },
    { "$unwind": "$versions" },
    { "$project": {
        "versions": "$versions"
        "same": { "$eq": [ "$versions.version", "$defaultVersion" ] }
    }}
    { "$match": { "same": true } },
    { "$project": {
        "_id": 0,
        "versions": 1
    }}
])

这允许您首先按"flag"条件过滤查询,然后检查数组的每个成员以比较两个字段是否相同。

如有必要,您可以将匹配的数组元素回滚到有多个匹配项的数组中。但我不认为这是你的要求。

试试这个:

db.so.find({
    flag: true,
    $where: function () {
        var versions = this.versions; 
        for (var i=0; i<versions.length; i++) {
            if (versions[i].version == this.defaultVersion) return true;
        }
    }
});

[编辑]杰克编辑了他的问题,说他不想使用JavaScript函数,而是一个简单的表达式。 我认为这是不可能的。

相关内容

  • 没有找到相关文章

最新更新