如何使用Mongoose获取字段过滤器中子文档数组的元素?

时间:2015-08-03 19:28:25

标签: node.js mongodb memory-management mongoose

我使用Mongoose和node.js来查询我们的mongoDB。我之前曾问过一个关于效率的问题(Way to lower memory usage by mongoose when doing query),这有助于教我使用lean()和stream()。

虽然内存效率有了很大提高,但我们仍然有一个问题:抓取像

这样的文档
Tig
r in th
 snow

我正在尝试按字段过滤输出(这些文档充满了数据,但我们正在构建的操作仅使用一些信息,来自几十万个文档),以便从我们需要传输的数据中减少不必要的批量和合作。具体来说,使用此示例,我们使用字段过滤器

{
field_a : abc,
field_b : def,
sub_docs : [
   {
     sub_doc_field_a : xyz,
     sub_doc_field_b : afk.
     sub_doc_submissions : [
         {
            submission_id: 0,
            score: 1
         },
         {
            submission_id: 1,
            score: 1
         }...
    },...
  ]
}

最后一部分导致了这个问题,它总是作为一个对象返回,即使精益以其他方式返回原始json。在跟踪内存使用情况时,返回信息的那部分占用的内存比简单的整数值占用的内存多。只是给出一个可见的差异示例,这是我通过console.log运行结果时的输出:

{"field_a": 1, "field_b": 1, "sub_docs.sub_doc_submissions.score":1}

理想的输出就像

{ field_a: abc,
  field_b: def,
  sub_docs:
    [ { sub_doc_submissions: [Object] },
      { sub_doc_submissions: [Object] },
      { sub_doc_submissions: [Object] } ] }

甚至更好

 { field_a: abc,
   field_b: def,
   sub_docs:
        [ { sub_doc_submissions: {score: 1} },
          { sub_doc_submissions: {score: 1} },
          { sub_doc_submissions: {score: 1} } ] }

由于内存使用几乎完全来自查询本身,我需要找到一种方法来告诉查询不要将sub_docs.sub_doc_submissions.score值作为对象返回,而只是返回它们的整数值。

有没有办法使用mongoose,或者如果有必要,使用mongo本身来执行此任务,以便mongoose不会尝试将返回的数据实例化为对象,尽管处于精简模式?

0 个答案:

没有答案