插入测试数据
db.billDetail.insert([
{
"billNo": 1001,
"address": "广东省",
"productList": [
{"price": 300,
"name": "可口可乐",
"type": "汽水"
},
{"price": 500,
"name": "茶派",
"type": "饮料"
}
]
},
{
"billNo": 1002,
"address": "湖南省",
"productList": [
{"price": 300,
"name": "百事可乐",
"type": "汽水"
},
{"price": 350,
"name": "可口可乐",
"type": "纯净水"
}
]
}
]
)
查询有可口可乐且价格为300的订单
方式一:以productList为key全值匹配
db.billDetail.find({productList:{price:300,name:"可口可乐",type:"汽水"}})
有结果返回:
{ _id: ObjectId("61714351da08b54a22178170"),
billNo: 1001,
address: '广东省',
productList:
[ { price: 300, name: '可口可乐', type: '汽水' },
{ price: 500, name: '茶派', type: '饮料' } ] }
方式二:以productList为key 去掉一个条件
db.billDetail.find({productList:{price:300,name:"可口可乐"}})
无返回结果
方式三:以productList为key全值匹配,但是product属性顺序改变
db.billDetail.find({productList:{price:300,type:"汽水",name:"可口可乐"}})
无返回结果。
方式四:内嵌文档.属性 的方式查询
db.billDetail.find({'productList.price':300,'productList.name':'可口可乐'})
返回两条结果
但是以上结果并不符合要求,第二条可口可乐的价格为350
方式五:利用$elemMatch操作符查询
db.billDetail.find({productList:{$elemMatch:{price:300,type:"汽水",name:"可口可乐"}}})
返回结果如下:
符合查询条件。
$elemMatch操作符将内嵌文档的两个属性以and连接作为一个整体条件。而方式四的两个属性的条件连接是 or 的方式。分别用price = 300 和 name = "可口可乐"匹配。