首页 > 解决方案 > 如何更新 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)

标签: javascriptfirebasefirebase-realtime-database

解决方案


Firebase 实时数据库需要知道您要写入的任何节点的完整准确位置。它没有您在此处尝试执行的“更新查询”的概念。

解决方案是:

  1. 执行查询
  2. 循环结果
  3. 更新它们中的每一个

在代码中是这样的:

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);
});

另见:


推荐阅读