计算MongoDB文档中子文档的条目

时间:2016-02-19 11:23:00

标签: mongodb mongodb-query

我有一个像这样的文档结构

{
    "_id" : "3:/content/somepath/test.txt",
    "_revisions" : {
        "r152f47f1daf-0-2" : "c",
        "r152f48413c1-0-2" : "c",
        "r152f4851bf7-0-1" : "c"
    }
}

我的任务是查找具有以下条件的所有文件:

  • “_id”需要以“5:”
  • 开头
  • 修订数量必须大于3

第一部分很简单,我用

解决了这个问题
db.nodes.find( {'_id': /^5:/} )

但我正在努力解决第二部分问题,我应该使用$gt

由于我是MongoDB的新手,我第一次看$size,但_revisions不是数组,它是一个子文档,对吗?

还在查看$unwind然后计算结果,但这也没有意义,因为我的结果需要是符合上述两个条件的文档。

任何指针都非常赞赏。

1 个答案:

答案 0 :(得分:1)

使用$where运算符。

db.nodes.find(function() { 
    return (/^5:/.test(this._id) && Object.keys(this._revisions).length > 3 ); 
})

documentation中提到的问题是:

  

$where评估JavaScript并且无法利用索引。因此,当您使用标准MongoDB运算符表达查询时,查询性能会提高(例如$gt$in)。

您一定要考虑将_revisions字段更改为这样的子文档数组:

{
    "_id" : "3:/content/somepath/test.txt",
    "_revisions" : [
        { 
            "rev": "r152f47f1daf-0-2",
            "value": "c"
        },
        {   
            "rev": "r152f48413c1-0-2",
            "value": "c"
        },
        {    
            "rev": "r152f4851bf7-0-1",
            "value": "c"
        }
    ]
}

并使用$exists运算符。

db.nodes.find({ "_id": /^5:/, "_revisions.3": { "$exists": true } } )