第七章 管理文档 - 在数据库中查找文档:%FindDocuments()
在数据库中查找文档:%FindDocuments()
要在数据库中查找一个或多个文档并将文档作为 JSON
返回,请调用 %FindDocuments()
方法。此方法采用三个可选位置谓词的任意组合:限制数组、投影数组和限制键:值对。
以下示例(没有位置谓词)都返回数据库中所有文档中的所有数据:
WRITE db.%FindDocuments().%ToJSON()
WRITE db.%FindDocuments(,,).%ToJSON()
限制谓词数组
限制谓词语法 ["property","value","operator"]
返回匹配文档的全部内容。可以将属性、值和运算符指定为数组作为搜索条件。如果不指定运算符,则默认为"="
。可以使用隐式 AND
逻辑将多个限制指定为一组限制谓词: [["property","value","operator"],["property2","value2","operator2"]]
。限制谓词是可选的。
以下示例返回 documentId
大于 2
的所有文档:
SET result = db.%FindDocuments(["%DocumentId",2,">"])
WRITE result.%ToJSON()
或通过链接方法:
WRITE db.%FindDocuments(["%DocumentId",2,">"]).%ToJSON()
如果文档的内容与搜索条件匹配,它将返回如下结果:
{
"sqlcode":100,"message":null,"content":[{
"%Doc":"{\"firstName\":\"Fred\",\"lastName\":\"Astare\"}","%DocumentId":"3","%LastModified":"2018-03-05 18:15:30.39"},{
"%Doc":"{\"firstName\":\"Ginger\",\"lastName\":\"Rogers\"}","%DocumentId":"4","%LastModified":"2018-03-05 18:15:30.39"}]}
如果没有文档符合搜索条件,则返回:
{
"sqlcode":100,"message":null,"content":[]}
要通过键:值对查找文档,必须为该键定义文档属性:
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":"Fred","lastName":"Rogers"})
SET val = db.%SaveDocument({
"firstName":"Serena","lastName":"Williams"})
SET val = db.%SaveDocument({
"firstName":"Bill","lastName":"Faulkner"})
SET val = db.%SaveDocument({
"firstName":"Barak","lastName":"Obama"})
SET val = db.%SaveDocument({
"firstName":"Fred","lastName":"Astare"})
SET val = db.%SaveDocument({
"lastName":"Madonna"})
SET result = db.%FindDocuments(["firstName","Fred","="])
WRITE result.%ToJSON()
可以使用各种谓词运算符,包括 %STARTSWITH
、IN
、NULL
和 NOT
NULL
,如以下示例所示:
SET result = db.%FindDocuments(["firstName","B","%STARTSWITH"])
WRITE result.%ToJSON()
SET result = db.%FindDocuments(["firstName","Bill,Fred","IN"])
WRITE result.%ToJSON()
SET result = db.%FindDocuments(["firstName","NULL","NULL"])
WRITE result.%ToJSON()
SET result = db.%FindDocuments(["firstName","NULL","NOT NULL"])
WRITE result.%ToJSON()