【问题标题】:Insert and merge a particular field in firestore firebase在 Firestore Firebase 中插入和合并特定字段
【发布时间】:2019-02-06 02:31:07
【问题描述】:

我的收藏中有一个这种格式的文档

name: xyz,
email: xyz@email.com,
age: 30,
address: {
    street_no: {
        complete_address: somedata,
        pincode: somepin
    },
    city:somecity,
    state:somestate,
    landmark:nearby
}

在这个文档中,我试图插入 complete_address 并将其与之前的记录合并。为了实现这一点,我正在尝试这个

const database = firebase.firestore();
var dataRef = database.collection('collection');
var query = dataRef.doc(key+"").get().then(doc=>{
    if(!doc.exists){
        res.send("doesn't exist");
    }else{
        //few checks
        if(doc.data().accessid != accessid){
            res.send("accessid doesn't match")
        }
        //here I am trying to insert and merge with the previous data
        var form_path = 'address.street_no.complete_address';
        dataRef.doc(key+"."+form_path).set({
            another_address
        }, {merge: true});
    }
}).catch(err=>{
    console.log(err)
})

但是当我执行它时,它只是在集合中添加另一个文档,然后是这个路径key.address.street_no.complete_address

我该怎么做才能只插入和合并以前的complete_address

form_path 中有 . 而不是 /,因为从 link 得到的想法很少

【问题讨论】:

    标签: javascript node.js firebase google-cloud-firestore


    【解决方案1】:

    我得到了这个工作。

    所以我发现我之前尝试做的事情将在集合中创建另一个文档,其中包含与它相关的数据。所以我开始把所有东西都当作一个对象,并将一个对象数据传递给set() 方法。

    const database = firebase.firestore();
    var dataRef = database.collection('collection');
    var query = dataRef.doc(key+"").get().then(doc=>{
        if(!doc.exists){
            res.send("doesn't exist");
        }else{
            //few checks
            if(doc.data().accessid != accessid){
                res.send("accessid doesn't match")
            }
            //here I am trying to insert and merge with the previous data
            var mergeData = {
                address : {
                }
            }
            var new_address = {
                key: "address_data"
            }
            mergeData.address[street_no] = {complete_address : address}
            if(dataRef.doc(key+"").set(mergeData, {merge: true})){
                res.send("done")
            }else{
                res.send("failed")
            }
        }
    }).catch(err=>{
        console.log(err)
    })
    

    【讨论】:

      【解决方案2】:

      我相信您的问题在于从以下几行开始

      var form_path = 'address.street_no.complete_address';

      接下来,您正在使用dataRef.doc(key+"."+form_path)

      这意味着唯一被设置的文档是

      /addressCollection/key.{addressCollectionId}

      addressCollectionIdaddress.street_no.complete_address

      相反,您想要做的是使用点符号访问文档中的属性,就像这样。

      address: {
          street_no: {
              complete_address
      

      示例。

      someDocument.update({
          "address.street_no.complete_address": "some_data"
      });
      

      请注意,“some_data”将替换当前存储的任何数据。您需要进行一次读取并合并数据。例如。

        const anotherAddress = { address: "123 Fake Street" };
      
        const document = firebase
          .firestore()
          .collection("addressCollection")
          .doc("someAddressId");
      
        document
          .get()
          .then(snap => {
            const data = snap.data();
            const completeAddress = data.address.street_no.complete_address };
      
            // We're using the spread operator here to combine the current completeAddress with anotherAddress
            return { completeAddress, ...anotherAddress };
          })
          .then(newCompleteAddress =>
            document.update({
              "address.street_no.complete_address": newCompleteAddress
            })
          );
      

      【讨论】:

      • 感谢菲利普,感谢您的时间和精力。我已经用另一种方式解决了这个问题。以下是我的回答
      • 谢谢。你的回答对我帮助很大!
      猜你喜欢
      • 2021-06-23
      • 2019-01-17
      • 2020-06-15
      • 2017-12-01
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多