我在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中返回我的集合中的值?
答案 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]
}
}]
}
}
}
}
}])
注意::由于您的结构复杂,我们不得不执行一些其他步骤才能完成此操作,请查看有关其实际操作方式的简单说明:
db.collection.aggregate([{ $addFields: { count: { $subtract: [{ $size: { $split: ['$stringValue', ','] } }, 1] } } }])
步骤:
$addFields
,我们将为所有文档添加一个名为count
的新字段。$split
开始,该运算符将基于定界符,
分割字符串。因此,由,
Ex:- 'a,b,c'
至[a,b,c]
分隔的元素数组。$size
检查数组的大小,因此上面的示例(a,b,c作为三个元素)将返回3
。$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