获取嵌入式文档元数据的最佳实践?

时间:2015-02-03 19:26:50

标签: mongodb

因此,我的架构设计要求我使用嵌入式文档格式。虽然我认识到通过重新设计架构可以使我要问的内容变得更容易,但是当前的设计满足了所有其他要求,所以我尽力使其工作。

考虑以下粗略模式:

{
    "_id" : "01234ABCD,
    "type" : "thing",
    "resources" : {
         foo : [
                 {
                   "herp" : "derp",
                 },

             ],
         bar : [
                 {
                   "herp" : "derp",
                 },
                 {
                   "derp" : "herp"
                 }
             ]
    },
}

显然,与“资源”键对应的值是嵌入式文档。我希望能够有效地计算该文档中的键数,并根据对该值的测试得出结果。 重要的是要注意嵌入式文档的长度和内容是未知数量 - 因此我希望能够查询此元数据。作为一个完整的js白痴,我已经设法凑齐了以下的查询。例如,如果我要在“资源”文档中查找包含3个以上键的文档:

  db.coll.find({$where: function(){ 
      var total = 0; 
      for(i in this['resources']){ 
          ++total; 
          if(total > 3){
              return true;
          }
      }    
  }})

由于我对Mongo很陌生并且在js上很糟糕,我觉得可能有更聪明的方法来做到这一点。我也非常好奇地听到有关这是否违背Mongo精神的意见,而不是将此处理推送给客户。对此方法和实施的任何反馈或批评都是最受欢迎的。

感谢阅读。

1 个答案:

答案 0 :(得分:0)

您可以使用aggregate pipeline汇总有关文档的元数据,然后对其进行过滤。

db.coll.aggregate([
    {$project: {
        // Compute a total count of the keys in the resources docs
        keys: {$add: [{$size: '$resources.foo'}, {$size: '$resources.bar'}]},
        // Project the original doc
        doc: '$$ROOT'
    }},
    // Only include the docs that have more than 3 keys
    {$match: {keys: {$gt: 3}}}
])