如何返回两个字段具有相同值的文档

时间:2016-05-10 12:44:41

标签: mongodb meteor mongodb-query aggregation-framework

是否可以在两个给定字段中仅查找具有相同值的集合中的那些文档?

{
    _id:    'fewSFDewvfG20df', 
    start:  10,
    end:    10
}

由于此处startend具有相同的值,因此将选择此文档。

我想像......

Collection.find({ start: { $eq: end } })

...这不会起作用,因为end必须是一个值。

2 个答案:

答案 0 :(得分:5)

这里有两种选择。第一个是使用$where运算符。

Collection.find( { $where: "this.start === this.end" } )

第二种选择是使用聚合框架和$redact运算符。

Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])
  

哪一个更好?

$where运算符执行JavaScript评估,无法利用索引,因此使用$where进行查询可能会导致应用程序性能下降。见considerations。如果你使用$,你的每个文件将在$ where操作之前从BSON转换为JavaScript对象,这将导致性能下降。当然,如果您有索引过滤器,则可以改进查询。如果您根据用户输入动态构建查询,也存在安全风险。

$redact之类的$where并不使用索引甚至执行收集扫描,但是当您$redact时,查询性能会提高,因为它是标准的MongoDB运算符。这就是说聚合选项要好得多,因为你总是可以使用$ match运算符过滤你的文档。

$where这里很好,但可以避免。另外,我相信当您遇到架构设计问题时,您只需要$where。例如,在索引文档中添加另一个布尔字段可能是一个不错的选择。

答案 1 :(得分:0)

此查询速度很快,因为涉及的函数调用次数最少,

Collection.find("this.start == this.end");