Firestore - batch.add不是一个函数

时间:2017-10-13 08:08:21

标签: google-cloud-firestore

Firestore批处理的documentation只会将set()update()delete()列为允许的操作。

是否无法向批处理中添加add()操作?我需要使用自动生成的ID创建文档。

7 个答案:

答案 0 :(得分:63)

您可以分两步完成此操作:

IF OBJECT_ID('tempdb..#TemperedFileList') IS NOT NULL DROP TABLE #TemperedFileList
GO
Declare @FileName varChar(255)
Declare @cmdText varChar(255)
Declare @BKFolder varchar(255)
Declare @DBFolder varchar(255)

set @FileName = null
set @BKFolder = 'E:\SQLBackupFolder\'
set @DBFolder = 'C:\Program Files\Microsoft SQL Server\MSSQL13.COBRASERVER\MSSQL\DATA\'

declare @FileList table (FileName varchar(255), DepthFlag int, FileFlag int)
--get all the files and folders in the backup folder and put them in temporary table
insert into @FileList exec xp_dirtree @BKFolder,0,1

create table #TemperedFileList (FileName varchar(255),DBName varchar(255))
insert into #TemperedFileList (FileName,DBName) select FileName, SUBSTRING(FileName,0,CHARINDEX('_',FileName)) from @FileList WHERE Filename like '%.bak'

declare @RowCnt int
declare @MaxRows int
declare @tmpFileName varchar(255)
declare @tmpDBName varchar(255)
declare @sql nvarchar(3000)

select @RowCnt = 1

declare @Import table (rownum int IDENTITY (1, 1) Primary key NOT NULL , FileName varchar(255),DBName varchar(255))
insert into @Import (FileName,DBName) SELECT FileName,DBName FROM  (SELECT FileName,DBName,rank() over (partition by DBName order by FileName desc) r FROM  #TemperedFileList ) ilv where r=1

select @MaxRows=count(*) from @Import
while @RowCnt <= @MaxRows
begin
    select @tmpFileName=FileName from @Import where rownum = @RowCnt
    select @tmpDBName=DBName from @Import where rownum = @RowCnt

    set @sql ='ALTER DATABASE ' + @tmpDBName + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
    print @sql
    exec(@sql)

    set @sql ='RESTORE DATABASE [' + @tmpDBName + '] FROM  DISK=''' + @BKFolder + @tmpFileName + ''' with FILE=1, MOVE N''' + @tmpDBName + ''' TO N''' + @DBFolder + @tmpDBName + '.mdf'', MOVE N''' + @tmpDBName + '_Log'' TO N''' + @DBFolder + @tmpDBName + '_log.ldf'',  NOUNLOAD,  REPLACE,  STATS = 10'
    print @sql
    exec(@sql)

    set @sql ='ALTER DATABASE ' + @tmpDBName + ' SET MULTI_USER WITH ROLLBACK IMMEDIATE'
    print @sql
    exec(@sql)

    Set @RowCnt = @RowCnt + 1
end

// Create a ref with auto-generated ID var newCityRef = db.collection('cities').doc(); // ... // Add it in the batch batch.set(newCityRef, { name: 'New York City' }); 方法不会向网络或磁盘写入任何内容,它只会使用您稍后可以使用的自动生成ID进行引用。

答案 1 :(得分:2)

根据文档

  

在幕后,.add(...)和.doc()。set(...)是完全等效的,所以你可以使用更方便的。

也许这也适用于批次?

答案 2 :(得分:2)

对于 PHP ,您可以尝试:

$batch = $db->batch();
$newCityRef = $db->collection('cities')->newDocument();
$batch->set($newCityRef , [ 'name'=>'New York City' ]);

答案 3 :(得分:0)

创建要在其中添加批处理数据的集合的引用 我们使用forEach遍历req.body并使用set方法设置要添加到集合中的每个数据

我们提交数据,并使用commit方法将数据保存到集合中,并在成功后发送成功响应。

cloud firestore

答案 4 :(得分:0)

在我的情况下,使用AngularFire2,我必须使用batch.set()方法,将具有先前创建的ID和reference属性的文档引用作为第一个参数传递:

import { AngularFirestore } from '@angular/fire/firestore';
...
private afs: AngularFirestore
...
batch.set(
    this.afs.collection('estados').doc(this.afs.createId()).ref,
    er.getData()
  );

答案 5 :(得分:0)

让我们假设您具有城市列表,并且想要批量编写。

 final CityList = FirebaseFirestore.instance.collection('cities')
 WriteBatch batch = FirebaseFirestore.instance.batch();
 for(CityList city in cities) {
    final newShoppingItem = ShoppingList.doc();
    batch.set(newShoppingItem, {
  'name': city.name,
  'createdAt': DateTime
      .now()
      .millisecondsSinceEpoch
});
}
 batch.commit();

答案 6 :(得分:0)

Sam Stern 的回答是正确的方法,但如果您使用的是 AngularFire,则不能在没有参数的情况下使用 .doc() 来生成新的 docId(请参阅 {{3} }).

AngularFire 这样做的方法是:

// Create a ref with auto-generated ID
const id = this.db.createId();
const newCityRef= this.db.collection("cities").doc(id);

// ...

// Add it in the batch
batch.set(newCityRef, { name: 'New York City' });