<i id='fSz6I'><tr id='fSz6I'><dt id='fSz6I'><q id='fSz6I'><span id='fSz6I'><b id='fSz6I'><form id='fSz6I'><ins id='fSz6I'></ins><ul id='fSz6I'></ul><sub id='fSz6I'></sub></form><legend id='fSz6I'></legend><bdo id='fSz6I'><pre id='fSz6I'><center id='fSz6I'></center></pre></bdo></b><th id='fSz6I'></th></span></q></dt></tr></i><div id='fSz6I'><tfoot id='fSz6I'></tfoot><dl id='fSz6I'><fieldset id='fSz6I'></fieldset></dl></div>

  • <tfoot id='fSz6I'></tfoot>

        <legend id='fSz6I'><style id='fSz6I'><dir id='fSz6I'><q id='fSz6I'></q></dir></style></legend>

          <bdo id='fSz6I'></bdo><ul id='fSz6I'></ul>
      1. <small id='fSz6I'></small><noframes id='fSz6I'>

        Mongoose/MongoDB:计算数组中的元素

        时间:2023-09-07

          <small id='klaL6'></small><noframes id='klaL6'>

          <tfoot id='klaL6'></tfoot>

                  <tbody id='klaL6'></tbody>
                <legend id='klaL6'><style id='klaL6'><dir id='klaL6'><q id='klaL6'></q></dir></style></legend>

              • <i id='klaL6'><tr id='klaL6'><dt id='klaL6'><q id='klaL6'><span id='klaL6'><b id='klaL6'><form id='klaL6'><ins id='klaL6'></ins><ul id='klaL6'></ul><sub id='klaL6'></sub></form><legend id='klaL6'></legend><bdo id='klaL6'><pre id='klaL6'><center id='klaL6'></center></pre></bdo></b><th id='klaL6'></th></span></q></dt></tr></i><div id='klaL6'><tfoot id='klaL6'></tfoot><dl id='klaL6'><fieldset id='klaL6'></fieldset></dl></div>

                  <bdo id='klaL6'></bdo><ul id='klaL6'></ul>
                • 本文介绍了Mongoose/MongoDB:计算数组中的元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我正在尝试使用 Mongoose 在我的集合中的数组中计算字符串的出现次数.我的模式"如下所示:

                  I'm trying to count the number of occurrences of a string in an array in my collection using Mongoose. My "schema" looks like this:

                  var ThingSchema = new Schema({
                    tokens: [ String ]
                  });
                  

                  我的目标是获取Thing"集合中的前 10 个令牌",每个文档可以包含多个值.例如:

                  My objective is to get the top 10 "tokens" in the "Thing" collection, which can contain multiple values per document. For example:

                  var documentOne = {
                      _id: ObjectId('50ff1299a6177ef9160007fa')
                    , tokens: [ 'foo' ]
                  }
                  
                  var documentTwo = {
                      _id: ObjectId('50ff1299a6177ef9160007fb')
                    , tokens: [ 'foo', 'bar' ]
                  }
                  
                  var documentThree = {
                      _id: ObjectId('50ff1299a6177ef9160007fc')
                    , tokens: [ 'foo', 'bar', 'baz' ]
                  }
                  
                  var documentFour = {
                      _id: ObjectId('50ff1299a6177ef9160007fd')
                    , tokens: [ 'foo', 'baz' ]
                  }
                  

                  ...会给我数据结果:

                  ...would give me data result:

                  [ foo: 4, bar: 2 baz: 2 ]
                  

                  我正在考虑为此工具使用 MapReduce 和 Aggregate,但我不确定什么是最佳选择.

                  I'm considering using MapReduce and Aggregate for this tool, but I'm not certain what is the best option.

                  推荐答案

                  啊哈,我找到了解决方案.MongoDB 的 aggregate 框架允许我们在集合上执行一系列任务.特别值得注意的是$unwind,它将文档中的数组分解为唯一的文档,因此它们可以被分组/计数en masse.

                  Aha, I've found the solution. MongoDB's aggregate framework allows us to execute a series of tasks on a collection. Of particular note is $unwind, which breaks an array in a document into unique documents, so they can be groups / counted en masse.

                  MongooseJS 在模型上非常容易地公开了这一点.使用上面的示例,如下所示:

                  MongooseJS exposes this very accessibly on a model. Using the example above, this looks as follows:

                  Thing.aggregate([
                      { $match: { /* Query can go here, if you want to filter results. */ } } 
                    , { $project: { tokens: 1 } } /* select the tokens field as something we want to "send" to the next command in the chain */
                    , { $unwind: '$tokens' } /* this converts arrays into unique documents for counting */
                    , { $group: { /* execute 'grouping' */
                            _id: { token: '$tokens' } /* using the 'token' value as the _id */
                          , count: { $sum: 1 } /* create a sum value */
                        }
                      }
                  ], function(err, topTopics) {
                    console.log(topTopics);
                    // [ foo: 4, bar: 2 baz: 2 ]
                  });
                  

                  在大约 200,000 条记录的初步测试中,它明显快于 MapReduce,因此扩展性可能更好,但这只是粗略的一瞥.YMMV.

                  It is noticeably faster than MapReduce in preliminary tests across ~200,000 records, and thus likely scales better, but this is only after a cursory glance. YMMV.

                  这篇关于Mongoose/MongoDB:计算数组中的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:通过reddit排名算法对mongodb进行排序 下一篇:对于 Array,使用 map() &amp; 是否更有效?在java

                  相关文章

                  最新文章

                    <bdo id='d2z7y'></bdo><ul id='d2z7y'></ul>

                    <i id='d2z7y'><tr id='d2z7y'><dt id='d2z7y'><q id='d2z7y'><span id='d2z7y'><b id='d2z7y'><form id='d2z7y'><ins id='d2z7y'></ins><ul id='d2z7y'></ul><sub id='d2z7y'></sub></form><legend id='d2z7y'></legend><bdo id='d2z7y'><pre id='d2z7y'><center id='d2z7y'></center></pre></bdo></b><th id='d2z7y'></th></span></q></dt></tr></i><div id='d2z7y'><tfoot id='d2z7y'></tfoot><dl id='d2z7y'><fieldset id='d2z7y'></fieldset></dl></div>
                    <tfoot id='d2z7y'></tfoot>

                    <small id='d2z7y'></small><noframes id='d2z7y'>

                    1. <legend id='d2z7y'><style id='d2z7y'><dir id='d2z7y'><q id='d2z7y'></q></dir></style></legend>