代码之家  ›  专栏  ›  技术社区  ›  Sumchans

azure cosmosdb是否像任何运算符一样具有查找与模式匹配的记录的功能

  •  0
  • Sumchans  · 技术社区  · 2 年前

    我只是想知道如何在Azure CosmosDB上使用SQL API执行以下操作-

    SELECT user_id FROM users WHERE user_id LIKE ANY(contacts);
    

    上面的声明适用于postgres,想知道Azure CosmosDB中是否有类似的东西。

    上面的语句接收一组像这样的数组格式的联系人[“4160000000”,“7780000000”],并在Postgres数据库中找到相应的记录。

    更新@Sajeetharan

    以下是我在宇宙数据库中的文件-

    {
        "users": [
            {
                "partitionKey": "user",
                "userPhoneNumber": "14161231234",
                "userDisplayName": "Test User 1"
            },
            {
                "partitionKey": "user",
                "userPhoneNumber": "18055678978",
                "userDisplayName": "Test User 2"
            },
            {
                "partitionKey": "user",
                "userPhoneNumber": "17202228799",
                "userDisplayName": "Test User 3"
            },
            {
                "partitionKey": "user",
                "userPhoneNumber": "17780265987",
                "userDisplayName": "Test User 4"
            }
        ]
    }
    

    我将以如下数组格式从javascript发送一组userPhoneNumbers,然后我需要SQL查询来返回cosmos数据库中的相应记录。

    var userPhoneNumbers = ["4161231234","7202228799"];
    

    上面的数组有两个值,当发送到cosmosdb时,应该返回第一个和第三个记录。

    发送的userPhoneNumbers有时会缺少国家代码,因此应该使用CONTAINS或ENDWITH进行搜索。

    请告知!

    0 回复  |  直到 2 年前
        1
  •  0
  •   RitikaNalwaya    2 年前

    如前所述,需要对作为数组传递的电话号码执行类似的操作。 在宇宙Db中,没有内置函数可以帮助我们实现结果。实现预期结果的方法是使用cosmosDb UDF。下面是相同的代码片段。

    function findUserNameByPhone(users, userPhoneNumbers) {
        var s, i, j;
        let result = [];
        for(j = 0; j < userPhoneNumbers.length; j++)
        {
            for (i = 0; i < users.length; i++) 
            {
                s = users[i];
                if(s.userPhoneNumber.match(userPhoneNumbers[j]))
                    result = result.concat(s);
            }
        }    
        return result;
    }
    

    在查询中使用udf:-

    SELECT udf.findUserNameByPhone(c.users,["4161231234","7202228799"]) FROM c
    

    根据注释进行编辑

    在选择查询中使用自定义项。此外,根据您的最新评论,如果您需要基于特定分区键的结果,您可以使用更新后的查询中所示的自联接。像 partitionKey 属性是的一部分 users 数组,因此通过在where子句中传递partitionKey值进行自联接。

    SELECT  DISTINCT udf.findUserNameByPhone(c.users,["4161231234","7202228799"]) FROM c
    JOIN u in c.users WHERE u.partitionKey = "user"
    

    使用Node.js检查在Cosmos DB中使用参数化查询 here

    推荐文章