获取嵌入文档元数据的最佳做法



因此,我的架构设计要求我使用嵌入式文档格式。 虽然我认识到通过重新设计架构可以更容易地提出我要问的问题,但当前的设计满足了所有其他要求,所以我正在尽最大努力使其工作。

请考虑以下基本架构:

{
    "_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精神的意见,因为没有将此处理推送给客户。 非常欢迎对这种方法和实施的任何反馈或批评。

感谢您的阅读。

您可以使用

aggregate管道来组合有关文档的元数据,然后对其进行筛选。

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}}}
])

最新更新