【问题标题】:MongoDB Exact Match with ConditionsMongoDB 与条件精确匹配
【发布时间】:2017-03-04 07:47:01
【问题描述】:

我创建了这个 URI 集合和一个允许我传递 URI 和 httpMethod 的函数,它构建了一个 MongoDB 查询来查找匹配的文档。问题是 URI 中可以包含动态元素……就像这样:

/api/v1/users/{userid}/profile

但也可以有这样的 URI:

/api/vi/users/all/

我在集合中屏蔽了我的 URI,所以我写了这个 Mongo 查询:

db.apis.aggregate({
    "$match" : {
        "$and" : [ 
            {"$or" : [{"_uri_.blocks.block" : "api","_uri_.blocks.position" : {"$eq" : 1.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 1.0}}]}, 
            {"$or" : [{"_uri_.blocks.block" : "v1","_uri_.blocks.position" : {"$eq" : 2.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 2.0}}]}, 
            {"$or" : [{"_uri_.blocks.block" : "users","_uri_.blocks.position" : {"$eq" : 3.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 3.0}}]}, 
            {"$or" : [{"_uri_.blocks.block" : "{userid}","_uri_.blocks.position" : {"$eq" : 4.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 4.0}}]}, 
            {"$or" : [{"_uri_.blocks.block" : "profile","_uri_.blocks.position" : {"$eq" : 5.0}},{"_uri_.blocks.isWild" : true,"_uri_.blocks.position" : {"$eq" : 5.0}}]}, 
            {"_canonical_._httpMethod_":"POST"}
        ]
    }
},
    {"$limit" : 1.0})

但它似乎并没有像我希望的那样完全匹配。

关于如何查询 Mongo 以仅返回最准确的文档的任何建议?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用$regex 匹配模式,输入以下内容:

    db.apis.insert([{
        "uri": "/api/v1/users/someUser/profile"
    }, {
        "uri": "/api/v2/users/otherUser/profile"
    }, {
        "uri": "/api/v2/users/otherUser/login"
    }, {
        "uri": "/api/v1/users/someUser/login"
    }, {
        "uri": "/api/v1/users/all/"
    }])
    
    • 匹配/api/v{version}/users/{userId}/profile

      var userId = "someUser";
      var version = 1;
      var limit = 1;
      
      db.apis.find({
          "uri": {
              $regex: '/api/v' + version + '/users/' + userId + '/profile'
          }
      }).limit(limit)
      
    • 匹配/api/v{version}/*

      var version = 1;
      var limit = 10;
      
      db.apis.find({
          "uri": {
              $regex: '/api/v' + version + '/.*'
          }
      }).limit(limit)
      

    【讨论】:

    • 有没有办法,如果我在文档中添加 URI 的正则表达式版本,我可以从中搜索我的 URI?所以我的文档可能有这个 URI /api/v.*/users/.*/profile 然后执行类似 db.apis.find("uri":"/api/v2/users/12312341/profile")
    • 我看不到您要做什么,您不想查找与特定 url 模式匹配的 userId 吗?
    • 这是我的问题。我正在尝试自动化一个相当大的 API 网络(3500 多个不同的 URI)。所以我永远不会知道 URI 中的哪个块是静态的还是动态的。我的集合中的每个 URI 都有一个文档,其中包含路由信息和其他信息。
    • 您能否举一个文档输入示例以及您在问题中需要的预期输出?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2013-03-10
    • 2015-10-09
    • 1970-01-01
    • 2022-07-01
    • 2021-11-12
    相关资源
    最近更新 更多