如下是一个内嵌的文档
[
{
"content": "文档1",
"comment": [
{
"author": "zhangsan",
"score": 3,
"comment": "shafa!"
},
{
"author": "lisi",
"score": 5,
"comment": "lzsb!"
}
]
},
{
"content": "w文档2.",
"comment": [
{
"author": "lisi",
"score": 2,
"comment": "shafa11!"
},
{
"author": "lisi",
"score": 3,
"comment": "lzsb22!"
}
]
}
]
如果需要查询 author 为 zhangsan score为3 的文档
如果查询条件如下:
{
"$and": [
{
"comment.author": {
"$eq": "zhangsan"
}
},
{
"comment.score": {
"$gte": "3"
}
}
]
}
得到的返回结果有两条,那就是说文档1和文档2都匹配上了,这显然不符合我们的预期,因为我们想要的是同时满足这两条,且在同一个对象当中。
出现上面结果的主要原因是:comment.author 实际存储的是一个数组 其中包含了该字段对应的所有名称。【zhangsan,lisi】,comment.score同理存储的也是数组。然而两者虽然被存放在同一个字段,实际存储确实分离的,毫无关系的。因此这样的查询也无法得到预期的结果。
那么我们就需要另一种替代的查询方式来代替
{
"$and": [
{
"comment": {
"$elemMatch": {
"author": {
"$eq": "zhangsan"
},
"score": {
"$eq": "3"
}
}
}
}
]
}
下面使用“$elemMatch”操作符即可将一组条件限定到数组中单条文档的匹配上:
所以通过上面的查询匹配方式,我们只获得一条结果,符合预期。