list: {
change: {
rate: integer,
last: Date
},
lock: string,
elements: {
...
},
size: integer
}
js prettyprint-override">exports.element_add = functions.database.ref('/list/elements/{element}).onCreate(
(snapshot, context) => {
const elements = snapshot.ref.parent;
return new Promise(
(resolve, reject) => {
const start = new Date().getTime();
async.waterfall(
[
// read and write to list.change
// ...
(next) => {
// increment list size
_changeSize(elements.parent, +1, 1, next)
},
// acquire lock if required and do calculations on list elements
// ...
],
// finally
function (e) {
// release the lock
// ...
// handle errors
if (e)
return reject(e);
resolve();
}
);
});
});
exports.element_remove = functions.database.ref('/list/elements/{element}).onDelete(
(snapshot, context) => {
const elements = snapshot.ref.parent;
return new Promise(
function (resolve, reject) {
_changeSize(elements.parent, -1, 1,
function (e) {
if (e)
return reject(e);
resolve();
}
)
}
)
});
function _changeSize(list, delta, attempt, done) {
list.child('size').transaction(
// update
(size) => {
if (size === null)
return null;
return size + delta;
},
// finally
(e, committed, snapshot) {
if (e) {
console.error(`size transaction error: ${e}, retrying in 1 sec`);
// try again
return setTimeout(_changeSize, 1000, list, delta, attempt + 1, done);
}
console.log(committed ? `new list size is ${snapshot.val()}` : 'list size was not updated');
// return new size if committed
done(null, committed ? snapshot.val() : undefined);
},
// do not apply locally
false
);
}
您必须使用实时数据库事务。
增量如下:
exports.element_add = functions.database.ref('/list/elements/{element}').onCreate(
(snapshot, context) => {
const sizeRef = admin
.database()
.ref('/list/size');
return sizeRef
.transaction(current_value => {
return (current_value || 0) + 1;
});
});
递减如下:
exports.element_delete = functions.database.ref('/list/elements/{element}').onDelete(
(snapshot, context) => {
const sizeRef = admin
.database()
.ref('/list/size');
return sizeRef
.transaction(current_value => {
if (current_value > 0) {
return current_value - 1;
} else {
//Normally we should never reach this line...
return null;
}
});
});
这是我的用户。kt 我做错了什么?
我正在为具有许多嵌套行的json数据库寻找将Firebase实时数据库数据迁移到云Firestore的最佳方法。示例: 我没有找到任何可以帮助我的东西。我需要迁移的是Cloud FireStore的新离线功能。我正在使用Ionic3(角度5)
我一直试图运行事务方法,但它无法在firebase数据库中获取和设置正确的数据。 代码如下:
简短的一般性问题:是否有一个侦听器(无论是firebase realtime、函数还是一般的侦听器)可以设置存储在firebase realtime对象中的日期,并在该日期到期时删除该对象? 长的具体问题:我正在与firebase实时数据库和firebase功能建立一个市场应用程序,用户可以对产品进行投标,但这些投标将在应用程序中存储的日期到期。用户也可以通过最高或最低的出价搜索/过滤产品,我正在
在我的项目中,我使用实时数据库以及Firestore数据库。当一个文档被添加到Firestore数据库中的特定集合时,我的云函数会触发。然后该函数写入我的实时数据库以更新一些统计信息。我注意到,即使没有用户连接到我的实时数据库,当云函数写入实时数据库时,并发连接的数量也会增加。这是否意味着我的云功能被视为并发连接,并将减少可以同时连接到我的实时数据库的用户数,因为有100k并发连接的限制?
实时数据库触发器在写入创建时是排队还是线程化?