【问题标题】:How I count a specific characters in a String in Mongoose?如何计算 Mongoose 中字符串中的特定字符?
【发布时间】:2020-05-29 19:37:43
【问题描述】:

我在 MongoDB 的收藏中有这个,所以我只需要在 MED0 中计算逗号并返回 4。

当我在 Firebase 中执行此操作时,是这样的:

let medRef = db.ref('root/users/id1/MED0');
// change the object in an element of array
   function snapshotToArray(snapshot) {
      let returnArr = [];
      snapshot.forEach(function(childSnapshot) {
          let item = childSnapshot.val();
          item.key = childSnapshot.key;
        str= item.split(/\d+/).length;//split divide a string in an array of strings, and I use /\d+/ 
      //lenght counts the characters
          returnArr.push(str - 2); //-2 no count []
      });
      return returnArr;
  }; // on() synchronize data and snap is a snapshot of database

medRef.on('value', function(snapshot) {
    console.log(snapshotToArray(snapshot));
});

那么我如何在 Mongoose 中做同样的事情并在 MongoDB 中返回我的集合中的值?

【问题讨论】:

  • 啊,我错过了您问题的最后一行,因为它已与代码合并。请修正您的问题的格式以使其更清晰。

标签: mongodb firebase mongoose mongodb-query aggregate-functions


【解决方案1】:

一旦您在 mongoose 中定义了您的集合架构/模型 (collectionModel),您就可以使用 aggregation 来做到这一点:

collectionModel.aggregate([
    {
        $addFields: {
            med: {
                $map: {
                    input: '$med', as: 'each', in: {
                        $mergeObjects: ['$$each', {
                            count: {
                                $subtract: [{
                                    $size: {
                                        $split: [{
                                            $arrayElemAt: [{
                                                $let:
                                                {
                                                    vars: { valueArray: { $objectToArray: "$$each" } },
                                                    in: '$$valueArray.v'
                                                }
                                            }, 0]
                                        }, ","]
                                    }
                                }, 1]
                            }
                        }]
                    }
                }
            }
        }
    }])

测试: MongoDB-Playground

注意:由于您的结构很复杂,我们不得不做一些额外的步骤来完成它,请查看这个简单的说明,了解它是如何完成的:

db.collection.aggregate([{ $addFields: { count: { $subtract: [{ $size: { $split: ['$stringValue', ','] } }, 1] } } }])

步骤:

  1. 通过$addFields,我们向所有文档添加了一个名为count 的新字段。
  2. 让我们从内部运算符$split 开始,它将根据分隔符, 拆分字符串。所以一个由, 分隔的元素数组Ex:- 'a,b,c'[a,b,c]
  3. 然后我们使用$size 检查数组的大小,因此对于上述示例(a、b、c 作为三个元素),它将返回3
  4. 最后$subtract 减去长度减去1 得到数组中, 的数量。

收集文件:

/* 1 */
{
    "_id" : ObjectId("5e4631707f8bc30a75e40711"),
    "stringValue" : "123,23423,534,56,1"
}

/* 2 */
{
    "_id" : ObjectId("5e4631787f8bc30a75e40800"),
    "stringValue" : ""
}

/* 3 */
{
    "_id" : ObjectId("5e4631837f8bc30a75e40991"),
    "stringValue" : "123,1"
}

输出:

/* 1 */
{
    "_id" : ObjectId("5e4631707f8bc30a75e40711"),
    "stringValue" : "123,23423,534,56,1",
    "count" : 4.0
}

/* 2 */
{
    "_id" : ObjectId("5e4631787f8bc30a75e40800"),
    "stringValue" : "",
    "count" : 0.0
}

/* 3 */
{
    "_id" : ObjectId("5e4631837f8bc30a75e40991"),
    "stringValue" : "123,1",
    "count" : 1.0
}

参考: aggregation

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多