简体   繁体   中英

firebase grab by orderByChild then update results key

So i have this query and currently collects all the data with materialName equals to gold. I wanted change all to false.

// materialName = "gold" for example
database.ref('/app/posts').orderByChild('material').startAt(materialName).endAt(materialName).once('value', function (snapshot) {
    const materials = snapshot.val();
})

I have tried something like this:

database.ref('/app/posts').orderByChild('material').startAt(materialName).endAt(materialName).once('value', function (snapshot) {
    database.ref('/app/posts').update({material: false});
})

also I have tried this:

const newData = Object.assign({}, materials, {material: false});
// but this updates outside of the post, result will be:


"posts" : {
      "material": false,
      "post-1503586" : {
        "title": "sample title",
        "material" : "gold"
      },
      "post-9172991" : {
        "title": "sample title",
        "material" : "silver"
      }
    }

sample json:

"posts" : {
      "post-1503586" : {
        "title": "sample title",
        "material" : "gold"
      },
      "post-9172991" : {
        "title": "sample title",
        "material" : "silver"
      }
    }

You need to loop over the results (since there can be multiple matching nodes) and then update each:

database.ref('/app/posts')
  .orderByChild('material')
  .equalTo(materialName)
  .once('value', function (snapshot) {
    snapshot.forEach(function(child) {
      child.ref.update({material: false});
    });
});

You'll also note that I changed your .startAt().endAt() to an equalTo() , which gives the same results with less code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM