【问题标题】:Firestore: Update fields in nested objectsFirestore:更新嵌套对象中的字段
【发布时间】:2019-02-13 07:07:31
【问题描述】:

如何更新文档嵌套对象中的字段?文档中指出了点表示法,但是如何使用变量作为对象名称来实现更新?

结构如下:collection("fruits").doc("as867f56asd")

name: "banana"
abc-variable: 
    description:"blah"
    qty: 1

我想更新文档as867f56asdabc-variable.qty = 2

我的 JavaScript 需要使用一个变量作为对象名称。

我不知道更新的括号表示法。 .set{merge:true} 需要吗?

这是我到目前为止尝试过的代码(粗略粘贴):

qty = evt.target.value;
//create a string
var obj = firebase.firestore.FieldPath(item).quantity;
//str = item + '.quantity';
//obj[str] = qty;
// var myUpdate = {};
// myUpdate['${item}.quantity'] = qty;
//var obj = [item]["quantity:"] = qty;
console.log("item is " + item);
//var obj = {"'" + item + "'.quantity" : qty};
//obj[item]["quantity"] = qty;
console.log("qty is " + qty);
orderRef.update (
    {obj:2}
    //{"quantity":qty}
    //[item + '.quantity']: qty
    //[`favorites.${key}.color`] = true
    // ['${item}.quantity'] : qty
    //[`hello.${world}`]:
    //{[objname]}.value = 'value';
    //['favorites.' + key + '.color']: true
    //[item]["quantity"] = qty // err:reqd 2 args
    //item["quantity"] = qty
    //"favorites.color": "Red"
    //{"`item`.quantity": qty}
    //{"quantity":qty}
)

【问题讨论】:

  • 嘿罗恩。你能展示你试过的代码吗?我想你正在寻找类似values[abc-variable+".qty"] = 2 的东西,但如果我看到你已经做了什么,就更容易回答了。
  • .update( IDE 中说values 未定义。如果我将它包装在{} 中,它会显示Unexpected token [。如果我在更新之前声明 values = {},IDE 会接受它并通过 linting 但浏览器控制台会抛出错误 Uncaught TypeError: Cannot read property 'quantity' of undefined Doing: orderRef.update (values[item+".quantity"] = qty)
  • @FrankvanPuffelen 看来我需要确定一种对该字段(它是一个对象)的引用类型,然后从那里更新一个特定的属性。 FieldPath 甚至使用 URLencoding \fruits\abc-123doc\obj-field-var 定义引用,但我无法弄清楚。我打算放弃并重新编写整个文档以更新单个字段。我知道这行得通...
  • 这个myUpdate['${item}.quantity'] = qty; 应该是myUpdate[`${item}.quantity`] = qty;。所以在字符串周围加上反引号,因为这是字符串插值的 JavaScript 语法。
  • 您提供的代码中的item 是什么?

标签: javascript firebase google-cloud-firestore


【解决方案1】:

如果您尝试进行的更新:

let qty = 2
orderRef.update({"abc-variable.qty": qty});

但是如果abc-variable 是变量的值,你会这样做:

let qty = 2
let variable = "abc-variable";
var values = {};
values[variable] = qty;
orderRef.update(values);

更新

此代码仅更新收藏夹:

var variableObjectName = "favorites";
var qty = Date.now(); // just so it changes every time we run
var field = {quantity:qty};
var obj = {};
obj[variableObjectName] = field; 
ref.update(obj);

它不会删除文档上的任何其他属性。

更新 2

要更新嵌套对象中的单个字段,请使用 . 来寻址该字段:

ref.update({ "favorites.quantity": Date.now() });

请参阅documentation on how to update fields in nested objects

更新 3

对名称存储在变量中的字段执行深度更新:

var name = "favorites";
var update = {};
update[name+".quantity"] = Date.now();
ref.update(update);

再次显示在:https://jsbin.com/wileqo/edit?js,console

【讨论】:

  • 我挑战您尝试.update 存储在 Firestore 文档中的对象的单个字段,其中变量用作存储对象的名称。如果你能做到,我会给你[任何人]一个免费的 hightechtele.com BIC 打火机。 srsly。
  • 衷心感谢您的帮助。注意.update 之后的其他对象属性是如何被删除的?查看更新的 jsbin -> jsbin.com/decizubuyi/edit?js,console ...你能做到吗,只想更新 quantity 属性,而不要理会其他属性。
  • 抱歉,罗恩,我无法重现您所说的内容。我的整个文档唯一一次被覆盖是当您在代码中调用 ref.set() 时。一旦我在jsbin.com/xibodoc/1/edit?js,console 中更新了您的代码以删除set(),无论我多久调用一次update(),它都会保留所有其他字段。
  • 不是整个文档,而是整个嵌套对象。更新嵌套对象的单个属性(不删除其他嵌套对象的属性)是问题/问题。请注意,我的 jsbin 中的文档包含一个具有 2 个属性的嵌套对象,namequantity。你的显示了一个具有单个属性的嵌套对象。
  • 啊,我明白了。这很简单:ref.update({ "favorites.quantity ": Date.now() })。请参阅documentation on how to update fields in nested objects
猜你喜欢
  • 2021-04-14
  • 2018-08-15
  • 2021-12-15
  • 2018-11-12
  • 2018-11-08
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多