javascript - 如何更新 Firebase 上的多级数据?
问题描述
我想pickingStatus
用 Firebase 数据库更新,但我不知道该怎么做。这是数据库结构。我正在使用反应。
我可以通过以下查询获得信息。
ordersDb.child("-MCPA88ehpQPnavBRMcD/order_products/").orderByChild('productId').equalTo("gid://shopify/Product/5327606775964")
.on(
'value',
snapshot => {
console.log(`snapshot`)
console.log(snapshot.val())
}
);
此查询获取此信息。
0:
image: "https://cdn.shopify.com/s/files/1/0417/0262/1340/products/BeefPlateSliced.jpg?v=1593188870"
number: 1
pickingStatus: "Waiting"
productId: "gid://shopify/Product/5327606775964"
product_name: "Beef Plate Sliced"
sku: "BF0310"
weight: 0
此外,我将上述查询更改为此以更新信息。
const items = {
pickingStatus: 'PICKED'
}
ordersDb.child("-MCPA88ehpQPnavBRMcD/order_products/").orderByChild('productId').equalTo("gid://shopify/Product/5327606775964")
.update(items)
但是,我收到了这个错误。
PickingList.js?2fd3:151 Uncaught TypeError: _firebase__WEBPACK_IMPORTED_MODULE_2__.ordersDb.child(...).orderByChild(...).equalTo(...).update is not a function
at updateStatus (PickingList.js?2fd3:150)
at onClick (PickingList.js?2fd3:259)
at HTMLUnknownElement.callCallback (react-dom.development.js:188)
at Object.invokeGuardedCallbackDev (react-dom.development.js:237)
at invokeGuardedCallback (react-dom.development.js:292)
at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:306)
at executeDispatch (react-dom.development.js:389)
at executeDispatchesInOrder (react-dom.development.js:411)
at executeDispatchesAndRelease (react-dom.development.js:3278)
at executeDispatchesAndReleaseTopLevel (react-dom.development.js:3287)
at forEachAccumulated (react-dom.development.js:3259)
at runEventsInBatch (react-dom.development.js:3304)
at runExtractedPluginEventsInBatch (react-dom.development.js:3514)
at handleTopLevel (react-dom.development.js:3558)
at batchedEventUpdates$1 (react-dom.development.js:21871)
at batchedEventUpdates (react-dom.development.js:795)
at dispatchEventForLegacyPluginEventSystem (react-dom.development.js:3568)
at attemptToDispatchEvent (react-dom.development.js:4267)
at dispatchEvent (react-dom.development.js:4189)
at unstable_runWithPriority (scheduler.development.js:653)
at runWithPriority$1 (react-dom.development.js:11039)
at discreteUpdates$1 (react-dom.development.js:21887)
at discreteUpdates (react-dom.development.js:806)
at dispatchDiscreteEvent (react-dom.development.js:4168)
解决方案
Firebase 实时数据库需要知道您要写入的任何节点的完整准确位置。它没有您在此处尝试执行的“更新查询”的概念。
解决方案是:
- 执行查询
- 循环结果
- 更新它们中的每一个
在代码中是这样的:
const items = {
pickingStatus: 'PICKED'
}
const query = ordersDb.child("-MCPA88ehpQPnavBRMcD/order_products/").orderByChild('productId').equalTo("gid://shopify/Product/5327606775964")
query.get().then((results) => {
results.forEach((snapshot) => {
snapshot.ref.update(items)
});
});
或者,您可以在单个多位置更新查询中更新所有匹配项:
const ref = ordersDb.child("-MCPA88ehpQPnavBRMcD/order_products/").orderByChild('productId');
const query = ref.orderByChild('productId').equalTo("gid://shopify/Product/5327606775964");
query.get().then((results) => {
let updates = {}
results.forEach((snapshot) => {
updates[snapshot.key] = items;
});
ref.update(updates);
});
另见: