Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 强制同时设置多个子对象_Firebase - Fatal编程技术网

Firebase 强制同时设置多个子对象

Firebase 强制同时设置多个子对象,firebase,Firebase,我正在寻找后端和firebase的解决方案,同样有趣,但在开始使用它之前,我有一些问题 我的问题将以这个例子为基础 在“验证数据”一节中 在这个例子中,他们创建了一个小部件,小部件必须有颜色和大小。他们用以下行验证:“.validate”:“newData.haschilds(['color','size']),” 在这一行之后,就会发生这种情况 // PERMISSION_DENIED: does not have children color and size ref.set('foo');

我正在寻找后端和firebase的解决方案,同样有趣,但在开始使用它之前,我有一些问题

我的问题将以这个例子为基础 在“验证数据”一节中

在这个例子中,他们创建了一个小部件,小部件必须有颜色和大小。他们用以下行验证:“.validate”:“newData.haschilds(['color','size']),”

在这一行之后,就会发生这种情况

// PERMISSION_DENIED: does not have children color and size
ref.set('foo');
// PERMISSION DENIED: does not have child color
ref.set({size: 22});
// PERMISSION_DENIED: size is not a number
ref.set({ size: 'foo', color: 'red' });
// SUCCESS (assuming 'blue' appears in our colors list)
ref.set({ size: 21, color: 'blue'});
之后,如果客户机想要更新一个子系统,这将成功

// If the record already exists and has a color, this will
// succeed, otherwise it will fail since newData.hasChildren(['color', 'size'])
// will fail to validate
ref.child('size').set(99);
我的问题是:我们能强迫客户总是同时更新尺寸和颜色吗。如果客户端尝试此“ref.child('size')。set(99);”。我想拒绝并只接受像“ref.set({size:21,color:'blue'})”这样的内容,即使记录已经存在

然后我希望在客户机上发生这种情况:

ref.set({ size: 21, color: 'blue'}); //Sucess, now size and color exist
ref.child('size').set(99); //Fail, you did not update color at the same time
ref.set({ size: 22, color: 'red'}); //Success, you just change the size 
                                    //and the color. You didnt create a new
                                    //value, you change value already there

谢谢

我想你回答了你自己的问题:

您发布的规则:

“.validate”:newData.haschilds(['color','size'])”

只接受将数据写入设置了颜色和大小的节点。Add!data.exists()验证该节点是否不存在

这意味着:

ref.set({ size: 21, color: 'blue'});
这失败了:

ref.set({ size: 21 });
这里的关键是确保新数据符合规则的newData。然后添加!data.exists()以确保数据不存在


还有一些其他方法可以强制执行此操作。

谢谢,但如果我理解您的回答,您可以添加“!data.exists()来验证它是否已经存在。然后,如果用户尝试更改为值,它将失败,因为数据存在。但是我想允许客户端更改值,即使数据存在。然后如果客户端ref.set({size:21,color:'blue'});//成功,值现在存在,我想要这个“ref.child('size').set(99);“fail,but”ref.set({size:21,颜色:'blue'});“将成功。我的问题是否清楚?或者我只是不理解anwser?只有当您不想覆盖现有数据时,!data.exists才适用。如果您希望即使数据存在也能更改数据,请忽略此项。我提供的答案将允许您覆盖现有数据,只要它包括子数据的大小和颜色。然后,您需要执行“.validate”:newData.haschilds(['color','size'])”。但是从命令“/”中,如果记录已经存在并且具有颜色,则该操作将//成功,否则它将失败,因为newData.haschilds(['color','size'])//将无法验证ref.child('size')。set(99);”将成功。那么这个网站是错的或者我遗漏了什么记住:用新数据进行验证会同时查看现有数据和新数据。如果您曾经将color:blue写入该节点(在有规则之前),然后稍后将size:99写入,则该操作将成功,因为该节点需要同时具有颜色和大小。如果它以前没有颜色:蓝色,那么它将失败,因为这是验证所要求的。如果您放置了一个规则,该规则需要两个子节点,并且节点根本不存在,或者两个子节点都已经存在,那么将强制同时更新两个子节点。谢谢,我将不得不测试它。但这似乎是可能的。谢谢