【问题标题】:Counting entries of subdocument in MongoDB documents计算 MongoDB 文档中子文档的条目
【发布时间】:2016-02-19 20:49:06
【问题描述】:

我有这样的文档结构

{
    "_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,然后计算结果,但这也没有意义,因为我的结果需要是符合上述两个条件的文档。

高度赞赏的任何指针。

【问题讨论】:

  • 更好的设计是让您的_revisions 字段成为一个子文档数组。类似"_revisions":[{"key":"r...","value":"c"}]。关键是以这样一种方式设计您的模式,即您触发的 90% 的查询可以轻松获取结果,而无需涉及复杂的客户端或服务器端逻辑。此外,将键名设置为 predefined attributesnot 动态/散列字符串是更好的设计。
  • @BatScream 这是我在回答中提到的,但 OP 似乎想使用 $gt 运算符而不更改其文档结构,这在此处是不可能的。

标签: mongodb mongodb-query


【解决方案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 } } )

【讨论】:

  • 实际上,我无法更改 _revisions 字段。该任务是课程的一部分。我也希望这样做,并且还查看了 $exists 运算符。但是他们希望我们使用 $gt 运算符,这对我来说没有意义,因为 _revisions 不是数组。
猜你喜欢
  • 2017-05-18
  • 2011-09-26
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多