第七章 管理文档 - 在数据库中查找文档:%FindDocuments()

30 阅读2分钟

第七章 管理文档 - 在数据库中查找文档:%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()

可以使用各种谓词运算符,包括 %STARTSWITHINNULLNOT 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()