制約述語配列
制約述語構文 ["property","value","operator"] は、一致するドキュメントの内容全体を返します。検索条件には、プロパティ、値、および演算子を配列として指定します。演算子を指定しない場合、既定値として "=" が設定されます。暗黙の AND ロジックを持つ制約述語の配列として、複数の制約を指定できます : [["property","value","operator"],["property2","value2","operator2"]]。制約述語はオプションです。
次の例では、ドキュメント ID が 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":[]}
key:value ペアでドキュメントを検索するには、そのキーのドキュメントプロパティを定義しておく必要があります。
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()
プロジェクション述語配列
返されるドキュメントの値の一部のみを返すには、プロジェクションを使用します。オプションのプロジェクション述語 ["prop1","prop2",...] は、対応する値を返すキーを示す配列です。プロジェクション配列でユーザ定義のキーを指定する場合、そのキーのドキュメントプロパティを定義しておく必要があります。
構文 ["property","value","operator"],["prop1","prop2",...] は、一致するドキュメントから指定されたプロパティを返します。
SET result = db.%FindDocuments(["firstName","Bill","="],["%DocumentId","firstName"])
WRITE result.%ToJSON()
制約述語の有無にかかわらず、プロジェクションを指定することができます。したがって、以下の両方とも有効な構文になります。
-
db.%FindDocuments(["property","value","operator"],[prop1,prop2,...]) 制約およびプロジェクション。
-
db.%FindDocuments(,[prop1,prop2,...]) 制約なし、プロジェクション。
制限述語
制限 key:value 述部 {"limit":int} を指定すると、最大で、指定した数の一致するドキュメントのみを返すことができます。
構文 ["property","value","operator"],["prop1","prop2",...],{"limit":int} は、指定された制限数のドキュメントから指定されたプロパティを返します。
SET result = db.%FindDocuments(["firstName","Bill","="],["%DocumentID","firstName"],{"limit":5})
WRITE result.%ToJSON()
この例では、最大 5 つのドキュメントからデータが返されます。
制約述語またはプロジェクション述語の有無にかかわらず、制限を指定することができます。したがって、以下のすべてが有効な構文になります。
-
db.%FindDocuments(["property","value","operator"],,{"limit":int}) 制約、プロジェクションなし、制限。
-
db.%FindDocuments(,[prop1,prop2,...],{"limit":int}) 制約なし、プロジェクション、制限。
-
db.%FindDocuments(,,{"limit":int}) 制約なし、プロジェクションなし、制限。
次の例では、制約なし、プロジェクション、制限を指定します。
WRITE db.%FindDocuments(,["%DocumentId","lastName"],{"limit":3}).%ToJSON()