About find $in query

Hello,Dose mongo has some way can like this query?

HI @Zheng_Ficoto,

Please provide more information on your topic:

  • example document
  • example query
  • expected results
  • version of MongoDB server

Thanks,
Stennie

WHERE (id1, id2) IN ((1, 2), (3, 4))

Hi,

Please see the SQL to MongoDB Mapping Chart for a general guide to equivalent statements. As mentioned earlier, more information would be helpful to understand what you are trying to achieve.

I believe you are looking for results matching id1 (value of 1 or 2) or id2 (value of 3 or 4), so the equivalent query in the mongo shell would be:

db.mydata.find(
    { $or: [
        { id1:{ $in: [1,2] } },
        { id2:{ $in: [3,4] } }
    ]}
)

Regards,
Stennie

Hi, I do not mean that,I want to query such as this

db.mydata.find(
    { $or: [
        { id1:1,id2:2},
        { id1:3,id2:4}
    ]}
)

but I need some other way to query,because $or sometime make query cannt using the right index,then query is too slowly.So,Is having other way to optimizeo some query like this?Except using hint(),thanks.

Hi @Zheng_Ficoto,

It sounds like your question may be about query performance rather than constructing a query.

Please provide more information to help understand your issue:

  • example document
  • example query with explain(true) output
  • expected results
  • version of MongoDB server

Thanks,
Stennie

I hope can use tuple to query,is mongo support using tuple to query?

  • example query
db.getCollection('lesson_consume_log').find({  
    "$or": [{  
      "order_num": "5f3e17dc0b586f0001a2e519",  
      "lesson_id": ObjectId("5e9013f31f6cfc00018e30ee")  
    }, {  
      "order_num": "5f3e17dc0b586f0001a2e519",  
      "lesson_id": ObjectId("5e9014351f6cfc00018e3103")  
    }, {  
      "order_num": "5f3e17dc0b586f0001a2e519",  
      "lesson_id": ObjectId("5e9014599976c5000161f330")  
    }],  
    "op_time": {  
      "$gte": ISODate("2020-08-20T00:00:00.000+0800"),  
      "$lte": ISODate("2020-08-20T23:59:59.999+0800")  
    }  
  }).explain(true)  
  • query plan
{  
  "stage": "FETCH",  
  "filter": {  
    "$and": [{  
        "op_time": {  
          "$lte": ISODate("2020-08-20T15:59:59.999Z")  
        }  
      },  
      {  
        "op_time": {  
          "$gte": ISODate("2020-08-19T16:00:00.000Z")  
        }  
      }  
    ]  
  },  
  "inputStage": {  
    "stage": "OR",  
    "inputStages": [{  
        "stage": "FETCH",  
        "filter": {  
          "order_num": {  
            "$eq": "5f3e17dc0b586f0001a2e519"  
          }  
        },  
        "inputStage": {  
          "stage": "IXSCAN",  
          "keyPattern": {  
            "lesson_id": 1.0  
          },  
          "indexName": "lesson_id_1",  
          "isMultiKey": false,  
          "multiKeyPaths": {  
            "lesson_id": []  
          },  
          "isUnique": false,  
          "isSparse": false,  
          "isPartial": false,  
          "indexVersion": 2,  
          "direction": "forward",  
          "indexBounds": {  
            "lesson_id": [  
              "[ObjectId('5e9013f31f6cfc00018e30ee'), ObjectId('5e9013f31f6cfc00018e30ee')]"  
            ]  
          }  
        }  
      },  
      {  
        "stage": "IXSCAN",  
        "keyPattern": {  
          "order_num": 1,  
          "lesson_id": 1  
        },  
        "indexName": "order_num_1_lesson_id_1",  
        "isMultiKey": false,  
        "multiKeyPaths": {  
          "order_num": [],  
          "lesson_id": []  
        },  
        "isUnique": false,  
        "isSparse": false,  
        "isPartial": false,  
        "indexVersion": 2,  
        "direction": "forward",  
        "indexBounds": {  
          "order_num": [  
            "[\"5f3e17dc0b586f0001a2e519\", \"5f3e17dc0b586f0001a2e519\"]"  
          ],  
          "lesson_id": [  
            "[ObjectId('5e9014351f6cfc00018e3103'), ObjectId('5e9014351f6cfc00018e3103')]"  
          ]  
        }  
      },  
      {  
        "stage": "IXSCAN",  
        "keyPattern": {  
          "order_num": 1,  
          "lesson_id": 1  
        },  
        "indexName": "order_num_1_lesson_id_1",  
        "isMultiKey": false,  
        "multiKeyPaths": {  
          "order_num": [],  
          "lesson_id": []  
        },  
        "isUnique": false,  
        "isSparse": false,  
        "isPartial": false,  
        "indexVersion": 2,  
        "direction": "forward",  
        "indexBounds": {  
          "order_num": [  
            "[\"5f3e17dc0b586f0001a2e519\", \"5f3e17dc0b586f0001a2e519\"]"  
          ],  
          "lesson_id": [  
            "[ObjectId('5e9014599976c5000161f330'), ObjectId('5e9014599976c5000161f330')]"  
          ]  
        }  
      }  
    ]  
  }  
}  

I hope this query only use “order_num_1_lesson_id_1”,but it need using hint(),and I hope it can use tuple query like this

WHERE (order_num, lesson_id) IN (
(“5f3e17dc0b586f0001a2e519”, ObjectId(‘5e9014599976c5000161f330’)),
(“5f3e17dc0b586f0001a2e519”, ObjectId(“5e9014351f6cfc00018e3103”)),
(“5f3e17dc0b586f0001a2e519”, ObjectId(“5e9013f31f6cfc00018e30ee”)))