如何计算猫鼬字符串中的特定字符?

时间:2020-02-14 01:53:38

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

我在MongoDB的集合中有这个,所以我只需要在MED0中计算逗号并返回4。 enter image description here

当我在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中返回我的集合中的值?

1 个答案:

答案 0 :(得分:0)

一旦在猫鼬中定义了收集模式/模型(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