1

I want to update pickingStatus with Firebase database tho, I have no clue how to do that. This is the DB structure. I'm using React.

se

I could get the information with below Query.

ordersDb.child("-MCPA88ehpQPnavBRMcD/order_products/").orderByChild('productId').equalTo("gid://shopify/Product/5327606775964")
    .on(
      'value',
      snapshot => {
        console.log(`snapshot`)
        console.log(snapshot.val())
      }
    );

This query fetched this information.

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

Furthermore, I change the above query to this to update the info.

    const items = {
      pickingStatus: 'PICKED'
    }    
    ordersDb.child("-MCPA88ehpQPnavBRMcD/order_products/").orderByChild('productId').equalTo("gid://shopify/Product/5327606775964")
    .update(items)

However, I got this error.

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)
uekyo
  • 421
  • 1
  • 4
  • 18
  • Start with the documentation. If you have a specific problem, post the code that isn't working the way you expect. https://firebase.google.com/docs/database/web/read-and-write#updating_or_deleting_data – Doug Stevenson Jul 17 '20 at 16:27
  • @DougStevenson Thank you for your advise. I added the query and also I'm gonna read it. – uekyo Jul 17 '20 at 17:17

1 Answers1

1

The Firebase Realtime Database needs to know the full, exact location for any node you want to write to. It doesn't have the concept of an "update query" which what you're trying to do here.

The solution is:

  1. Execute the query
  2. Loop over the results
  3. Update each of them

In code that'd be something like this:

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

Alternatively you can update all matching items in a single multi-location update query:

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

Also see:

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807