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

MongoDB&Mongoose查询返回null表示聚合$或搜索字段不匹配,返回单个搜索或省略未定义的值

  •  0
  • Mikhail  · 技术社区  · 7 年前

    $or 操作员被视为 $and

    我有以下要查询的收集文档:

    {
        "_id": {
            "$oid": "5bd0d709ff8eef5d5325090f"
        },
        "audienceTrackingID": "3e66c213-fe0b-4096-a99c-558a6c349b4b",
        "mainframeTrackingID": null,
        "partner1TrackingID": "85c5f168-08da-44d3-bbef-fbb3b8392ded",
        "__v": 0,
        "contentFocus": "Cooking",
        "ipRange": [
            "29.142.127.151"
        ]
    }
    

    使用以下查询:

    console.log(req.headers['x-original-ip']) // '29.142.127.151'
    console.log(req.headers['x-audience-tracking-id']) // undefined
    console.log(req.headers['x-partner-1-tracking-id']) // "85c5f168-08da-44d3-bbef-fbb3b8392ded"
    
    const clientMatch = await Client.findOne({
        $or: [{ 
            ipRange: req.headers['x-original-ip'],  
            audienceTrackingID: req.headers['x-audience-tracking-id'],
            partner1TrackingID: req.headers['x-partner-1-tracking-id'],
        }]
    })
    
    console.log(clientMatch) // null
    

    有些令人费解,比如查询单个字段,以及删除实际查询中参数未定义的查询( req.headers['x-audience-tracking-id'] )将产生结果(这让我想知道,为什么这就像一个AND,当一个queryfield失败时给我空值??)

    // ALL QUERIES HIT AND RETURN A MATCH:
    
    const tryThis = await Client.findOne({partner1TrackingID: req.headers['x-partner-1-tracking-id']})
    const ipMatch = await Client.findOne({ipRange: req.headers['x-original-ip']})
    const clientMatch = await Client.findOne({
        $or: [{ 
            ipRange: req.headers['x-original-ip'],  
            partner1TrackingID: req.headers['x-partner-1-tracking-id'],
        }]
    })
    

    这对我来说毫无意义。当其他字段匹配时,为什么我需要省略$或运算符中可能不匹配的字段以获得命中?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Akrion    7 年前

    query failed: cannot compare to undefined
    

    看到了吗 this here

    这是你得不到结果的一个原因,另一个原因是 $or 查询不正确。你得把这些东西分开 or-ed

    const clientMatch = await Client.findOne({
        $or: [
            {ipRange: req.headers['x-original-ip']},  
            {audienceTrackingID: req.headers['x-audience-tracking-id'] || ''},
            {partner1TrackingID: req.headers['x-partner-1-tracking-id']},
        ]
    })