在对象列表中查询,查找不同对象的某些属性 (CosmosDB SQL API)
Query in list of objects, looking for some attributes of different objects (CosmosDB SQL API)
当我尝试 select 对象数组时,我在查询 (CosmosDB SQL API) 时遇到问题。
我想知道我搜索的所有参数是否都在不同的对象中。
应找到下一个文档:
{
"_id" : "97e9272d-cd7e-4a26-3245-o4e67h29beqw",
"_type" : "Document",
"categories" : [
{
"_name" : "PruebaCategoria", (searching by this)
"Type" : "omega",
"Policy number" : "1234567890",
"date" : 1553081146391,
"boolean" : true
},
{
"_name" : "CategoryDemoTest",
"Type" : "free",
"Policy number" : "0987654321"
},
{
"_name" : "CategoryDemoTestDates",
"dateInitial" : 1553081146592, (and by this in range)
"dateEnd" : 1553081146594,
"Type" : "omega"
}
],
"partitionNumber" : 1,
"serial" : 1
}
我想复制下一个用于 mongodb 的查询 API:
{ "categories" : { "$all" : [{ "$elemMatch" : { "dateInitial" : { "$gt" : { "$numberLong" : "1553081146591" }, "$lt" : { "$numberLong" : "1553081146593" } } } }, { "$elemMatch" : { "_name" : "PruebaCategoria" } }] } }
我尝试了以下查询,但似乎只有当只有一个对象具有我要查找的所有元素时它们才匹配:
"SELECT VALUE c FROM c JOIN cat in c.categories WHERE cat._name=\"PruebaCategoria\" AND cat.dateInitial > 1553081146591 AND cat.dateInitial < 1553081146593"
是否存在进行此类搜索的方法(使用 CosmosDB SQL API)?
根据cosmos db sql api中的所有Array Functions,没有这种直接的方法来实现与"$all"
加"$elemMatch"
类似的功能mongo分贝。
在此处提供 stored procedure 解决方法。
代码:
function sample() {
var collection = getContext().getCollection();
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT * FROM c',
function (err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
var returnArray = [];
for(var i =0;i<feed.length;i++){
var nameFlag = false;
var dateInitialFlag = false;
for(var j = 0;j<feed[i].categories.length;j++){
if(nameFlag == false) {
if(feed[i].categories[j]._name == 'PruebaCategoria'){
nameFlag= true;
}
}
if(dateInitialFlag == false){
if(feed[i].categories[j].dateInitial <1553081146593 || feed[i].categories[j].dateInitial > 1553081146590){
dateInitialFlag= true;
}
}
if (nameFlag == true && dateInitialFlag == true) {
returnArray.push(feed[i]);
break;
}
}
}
var response = getContext().getResponse();
response.setBody(returnArray);
}
});
if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
您还可以 pass arguments to SP 以便动态过滤数据。
当我尝试 select 对象数组时,我在查询 (CosmosDB SQL API) 时遇到问题。 我想知道我搜索的所有参数是否都在不同的对象中。
应找到下一个文档:
{
"_id" : "97e9272d-cd7e-4a26-3245-o4e67h29beqw",
"_type" : "Document",
"categories" : [
{
"_name" : "PruebaCategoria", (searching by this)
"Type" : "omega",
"Policy number" : "1234567890",
"date" : 1553081146391,
"boolean" : true
},
{
"_name" : "CategoryDemoTest",
"Type" : "free",
"Policy number" : "0987654321"
},
{
"_name" : "CategoryDemoTestDates",
"dateInitial" : 1553081146592, (and by this in range)
"dateEnd" : 1553081146594,
"Type" : "omega"
}
],
"partitionNumber" : 1,
"serial" : 1
}
我想复制下一个用于 mongodb 的查询 API:
{ "categories" : { "$all" : [{ "$elemMatch" : { "dateInitial" : { "$gt" : { "$numberLong" : "1553081146591" }, "$lt" : { "$numberLong" : "1553081146593" } } } }, { "$elemMatch" : { "_name" : "PruebaCategoria" } }] } }
我尝试了以下查询,但似乎只有当只有一个对象具有我要查找的所有元素时它们才匹配:
"SELECT VALUE c FROM c JOIN cat in c.categories WHERE cat._name=\"PruebaCategoria\" AND cat.dateInitial > 1553081146591 AND cat.dateInitial < 1553081146593"
是否存在进行此类搜索的方法(使用 CosmosDB SQL API)?
根据cosmos db sql api中的所有Array Functions,没有这种直接的方法来实现与"$all"
加"$elemMatch"
类似的功能mongo分贝。
在此处提供 stored procedure 解决方法。
代码:
function sample() {
var collection = getContext().getCollection();
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT * FROM c',
function (err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
var returnArray = [];
for(var i =0;i<feed.length;i++){
var nameFlag = false;
var dateInitialFlag = false;
for(var j = 0;j<feed[i].categories.length;j++){
if(nameFlag == false) {
if(feed[i].categories[j]._name == 'PruebaCategoria'){
nameFlag= true;
}
}
if(dateInitialFlag == false){
if(feed[i].categories[j].dateInitial <1553081146593 || feed[i].categories[j].dateInitial > 1553081146590){
dateInitialFlag= true;
}
}
if (nameFlag == true && dateInitialFlag == true) {
returnArray.push(feed[i]);
break;
}
}
}
var response = getContext().getResponse();
response.setBody(returnArray);
}
});
if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
您还可以 pass arguments to SP 以便动态过滤数据。