【问题标题】:how to write $or query in node如何在节点中编写 $ 或查询
【发布时间】:2022-02-08 23:03:07
【问题描述】:

这就是我在 Node 中编写 Mongo 查询的方式。

query["serviceProvider.type"] = "prepaid";

但我需要在我的 Node 代码中编写这个查询,该代码仅适用于 MongoDB CLI。我怎样才能做到这一点,即我需要用两个不同的值查询相同的键。

db = db.getSiblingDB("test");
db.getCollection("transactions").find(
    { 
        
            
                $or : [
                    { 
                        "serviceProvider.type" : "prepaid"
                    }, 
                    { 
                        "serviceProvider.type" : "dth"
                    }
                ]
            
    }
);

{ 
    "_id" : ObjectId("5d8b057e3a22472facdb89a4"), 
    "customer" : {
        "isCustomerPaid" : true, 
        "customerID" : "", 
        "customer" : ""
    }, 
    "transaction" : {
        "transStatus" : false, 
        "transID" : "15693919985540280", 
        "number" : "8332900803", 
        "amount" : NumberInt(5), 
        "error" : "Something went wrong. Please try again after sometime."
    }, 
    "couponSurvey" : {
        "status" : false, 
        "isEligible" : false
    }, 
    "status" : true, 
    "advisor" : {
        "advisorID" : "BAA0280", 
        "name" : "John BA", 
        "phoneNumber" : 8005301205.0
    }, 
    "serviceProvider" : {
        "type" : "dth", 
        "providerID" : "5bbb42e7a28b1daee826d7ec", 
        "providerName" : "Sun Direct"
    }, 
    "provider" : {
        "refId" : "00", 
        "status" : "fail", 
        "startTime" : ISODate("2019-09-25T06:13:18.554+0000"), 
        "endTime" : ISODate("2019-09-25T06:13:18.554+0000"), 
        "message" : "Invalid Denomination"
    }, 
    "extras" : {
        "imei" : "865300302225654", 
        "latitude" : "99.9385189", 
        "longitude" : "11.5827393"
    }, 
    "createdAt" : ISODate("2019-09-25T06:13:18.790+0000"), 
    "updatedAt" : ISODate("2019-09-25T06:13:18.790+0000"), 
    "__v" : NumberInt(0)
}

这是数据库中的示例数据。请告诉我如何查询我需要的参数。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    有一件事,您的查询有一个类型,第二个serviceProvider 后面有一个空格,所以找不到值dth

    此外,要创建 $or 查询,您可以简单地使用相同的样式:

    let findQuery = {}
    const q1 = {"serviceProvider.type" : "prepaid"}
    const q2 = {"serviceProvider. type" : "dth"}
    findQuery['$or'] = [q1,q2]
    
    console.log(findQuery)

    或者即使你的值在一个数组中:

    const values = ["prepaid","dth"]
    let findQuery = {
    '$or': values.map(m => {return {"serviceProvider.type":m}} )
    }
    
    console.log(findQuery)

    或者,甚至...您可以使用$regex 找到这两个值:

    const values = ["prepaid","dth"]
    let findQuery = {
      "serviceProvider.type":{
        '$regex':values.join('|')
      }
    }
    
    console.log(findQuery)

    例如here

    【讨论】:

    • 尝试了这些解决方案,但我只得到预付值。我已经编辑了问题,您可以再看一下吗?
    • 你能添加一个你的数据库的示例数据吗?
    【解决方案2】:

    如果您想查询特定键的值是否是值列表之一,您可以使用$or,而不是使用$in

    const findQuery = {
      "serviceProvider.type": {
        $in: [
          "prepaid",
          "dth"
        ]
      }
    }
    

    Mongoplayground Link Here

    【讨论】:

    • 我也试过了,仍然只能得到预付值。不明白为什么。此外,我还需要使用该 findQuery 来查询其他参数并将其进一步传递给异步函数(如果此信息有任何区别)。这些查询在 Mongo CLI 中运行良好,但在我的 Node API 代码中却不行。
    • 在进行查询之前尝试记录查询 obj 并查看它是否与您在 cli 中进行的查询相同
    • 是的,是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多