$elemMatch和and逻辑多条件查询数组内容[mongoDB][高级查询]

数据如下

{ 
    "_id" : "124", 
    "qList" : [
        {
            "qid" : 1, 
            "reorderFlag" : a
        }, 
        {
            "qid" : 2, 
            "reorderFlag" : b
        }
    ]
}{ 
    "_id" : "456", 
    "qList" : [
        {
            "qid" : 2, 
            "reorderFlag" : c
        }, 
        {
            "qid" : 10, 
            "reorderFlag" : b
        }
    ]
}

两方法多条件查询数组内容

以上两条数据,看看下面相同条件的两个方法查询结果为啥不同。

两种查询方法,结果有所不同:

方法一,使用$elemMatch查询,只查到_id为124的一条数据
//1条数据

db.parts.find({ "qList": { 
	$elemMatch: {
    	"qid": "2", "reorderFlag": "b"
    	} 
    } 
})

方法二,使用and逻辑查询,查到_id为124和_id为456的两条数据
//2条数据

db.parts.find({ "qList.qid":"2","qList.reorderFlag":"b"})

原因:

方法一$elemMatch定义是:qList数组内至少有一个元素,同时满足上面两个条件才算正确。

方法二and逻辑:qList数组内至少有一个元素,满足第一个条件,然后qList数组内至少有一个元素,满足第二个条件。这样就算正确。

区别:

方法一,严格,需要元素同时满足多个条件;方法二,不严格,不一定在一个元素同时满足多个条件,也可以多个元素只要”凑齐“这些条件就行。

结论:

以上两个方法用于数组内多条件查询。当只有一个条件时候用方法二(and逻辑的)就行,当有多个条件时候就用方法一($elemMatch)查到的数据准确(当然看业务来定)

附录:

只有一个条件,但是该条件有两个值,请使用:

db.parts.find({$and:[
  { "qList.qid":"2"},
  { "qList.qid":"1"} 
]})

查到_id为124的一条数据(该数组内所有元素,至少一个元素满足qid为2,至少还有一个元素满足qid为1)

最后再添加上官方API($elemMatch)连接:
https://docs.mongodb.com/manual/reference/operator/query/elemMatch/

你可能感兴趣的:(mongoDB)