第六章 管理文档 - 插入或替换文档:%SaveDocument()
文章目录
- 第六章 管理文档 - 插入或替换文档:%SaveDocument()
- 插入或替换文档:`%SaveDocument()`
- 计算数据库中的文档数:`%Size()`
- 获取数据库中的文档:`%GetDocument()`
第六章 管理文档 - 插入或替换文档:%SaveDocument()
插入或替换文档:%SaveDocument()
可以使用文档 ID
或数据选择条件在数据库中插入或替换文档。
%SaveDocument()
和%SaveDocumentByKey()
法保存文档、插入新文档或替换现有文档。 %SaveDocument()
通过documentId
指定文档; %SaveDocumentByKey()
通过键名和键值指定文档。
如果不指定 documentId
,%SaveDocument()
会插入一个新文档并生成一个新 documentId
。如果指定 documentId
,它将用该 documentId
替换现有文档。如果指定 documentId
但该文档不存在,则会生成 ERROR #5809
异常。
文档数据由一个或多个键:值对组成。如果为定义为唯一的键属性指定重复值,则会生成 ERROR #5808
异常。
%SaveDocument()
和 %SaveDocumentByKey()
方法返回对数据库文档类实例的引用。这始终是 %DocDB.Document
的子类。该方法返回数据类型为%DocDB.Document
。
以下示例插入三个新文档并为其分配 documentId
。然后,它将 documentId 2
标识的文档的全部内容替换为指定的内容:
IF $SYSTEM.DocDB.Exists("People"){ SET db = ##class(%DocDB.Database).%GetDatabase("People")}ELSE {SET db = ##class(%DocDB.Database).%CreateDatabase("People") }WRITE db.%Size(),!DO db.%CreateProperty("firstName","%String","$.firstName",0)SET val = db.%SaveDocument({"firstName":"Serena","lastName":"Williams"})SET val = db.%SaveDocument({"firstName":"Bill","lastName":"Faulkner"})SET val = db.%SaveDocument({"firstName":"Fred","lastName":"Astare"})WRITE "Contains ",db.%Size()," documents: ",db.%ToJSON()SET val = db.%SaveDocument({"firstName":"William","lastName":"Faulkner"},2)WRITE !,"Contains ",db.%Size()," documents: ",db.%ToJSON()
以下示例将 %Id()
方法链接到每个 %SaveDocument()
,在插入或替换每个文档时返回每个文档的 documentId
:
IF $SYSTEM.DocDB.Exists("People"){ SET db = ##class(%DocDB.Database).%GetDatabase("People")}ELSE {SET db = ##class(%DocDB.Database).%CreateDatabase("People") }DO db.%CreateProperty("firstName","%String","$.firstName",0)WRITE db.%SaveDocument({"firstName":"Serena","lastName":"Williams"}).%Id(),!WRITE db.%SaveDocument({"firstName":"Bill","lastName":"Faulkner"}).%Id(),!WRITE db.%SaveDocument({"firstName":"Fred","lastName":"Astare"}).%Id(),!WRITE "Contains ",db.%Size()," documents: ",db.%ToJSON()WRITE db.%SaveDocument({"firstName":"William","lastName":"Faulkner"},2).%Id(),!WRITE !,"Contains ",db.%Size()," documents: ",db.%ToJSON()
计算数据库中的文档数:%Size()
要计算数据库中的文档数量,请调用 %Size()
方法:
SET doccount = db.%Size()WRITE doccount
获取数据库中的文档:%GetDocument()
要通过 %DocumentId
从数据库检索单个文档,请调用 %GetDocument()
方法,如以下示例所示:
DO db.%GetDocument(2).%ToJSON()
此方法仅返回 %Doc
属性内容。例如:
{"firstName":"Bill","lastName":"Faulkner"}
该方法返回类型为%Library.DynamicAbstractObject
。
如果指定的 %DocumentId
不存在,%GetDocument()
会生成错误 #5809
异常:“未找到要加载的对象”。
可以使用 %GetDocumentByKey()
,按键值从数据库中检索单个文档。
还可以使用 %FindDocuments()
方法通过 %DocumentId
从数据库返回单个文档。例如:
DO db.%FindDocuments(["%DocumentId",2,"="]).%ToJSON()
此方法返回完整的 JSON
文档,包括其包装器:
{"sqlcode":100,"message":null,"content":[{"%Doc":"{\"firstName\":\"Bill\",\"lastName\":\"Faulkner\"}",
"%DocumentId":2,"%LastModified":"2018-03-06 18:59:02.559"}]}