【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!
博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!
吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…
背景介绍
我们以商品信息为案例存储在MongoDB数据库,数据结构如下,带大家学习基础的查询语法
数据模型解释
解释一下(product)模型各个字段的含义
- _id 字段:这是文档的唯一标识符。
- name 字段:这是产品的名称。
- description 字段:这是产品的简短说明或描述。
- price 字段:这是产品的价格。
- category 字段:这是产品所属的分类或种类。
- imageURL 字段:这是指向产品图片链接的URI。
- variants 字段:这是一个内嵌文档,其中包含产品的不同版本或选项。
- colorsAndSizes 字段:这是一个数组,其中包含多个选项的颜色和尺寸。
- brand 字段:这也是一个内嵌文档,包含品牌的详细信息。
- ratings 字段:这是一个数组,其中包含产品收到的评价。
- numReviews 字段:这是产品获得的总评价数量。
- dateAdded 字段:这是产品添加到数据库的时间。
- {_id:ObjectId(“your_object_id”)}:这是一个特殊的文档ID。
以上都是 MongoDB 文档的基本组成部分,可以供你参考。这些文档可以根据实际需求调整以满足您的业务需求。
案例学习
1、查询所有产品
db.product.find()
2、查询某个ID的产品
db.product.find({_id:ObjectId("5a934e000102030405000002")})
3、查询name
db.product.find({ name : 'Product 2'})
4、查询类别为电子产品的所有产品
db.product.find( { category : 'Electronics' } )
5、查询价格大于$20的产品
db.product.find({ price : { $gt : 20 } })
6、查询带有“黑色”选项的产品:
db.product.find({ "variants.colorsAndSizes.color": "black" })
7、优化成根据颜色模糊查询
说明:其中 /black/ 是正则表达式模式,表示文本需以"black"开头,并且结束。而 i 是标志位(flag),它告诉MongoDB引擎此模式是大小写不敏感的。
db.product.find({ "variants.colorsAndSizes.color": { $regex: /black/i } })
8、模糊查询
如果您想实现更复杂的,例如只匹配以"b"开始的颜色,请使用
db.product.find({ "variants.colorsAndSizes.color": { $regex: /^b/}})
9、联合查询
查询评级至少为5星且大于等于2条评论的产品
db.product.find({
ratings : { $elemMatch : { rating : { $gte : 5 }, review : {$exists : true} } },
numReviews : { $gte : 2 }
})
这是一个用于查询至少有两个评价并且平均分大于等于5分的所有产品的MongoDB查询语句。具体而言:
- ratings字段:指定了要在哪个字段上进行查询。
- $elemMatch运算符:确定要匹配哪些元素或文档内的子文档符合指定条件,在这种情况下是要筛选评级大于等于5且存在评论的所有评级。
- { rating : { KaTeX parse error: Expected 'EOF', got '}' at position 9: gte : 5 }̲, review : {exists : true}定义了我们要查找的标准——查询所有评分大于等于5分的产品评级,而且要求评论存在。
- { numReviews : { $gte : 2 }} 进一步规定产品的总评分数必须大于等于2。 这将返回符合条件的产品列表。
10、查询某个品牌的所有产品
db.product.find({ "brand.name" : 'Brand X' })
db.product.find({ "brand.name" : { $regex: /a/} })
- db.product.find({ “brand.name” : { $regex: /a/ } })是MongoDB中的一个查询语句,它可以查找到集合中的所有产品,其品牌名称包含"a"这个字符。
- 其中 “brand.name” 表示我们要搜索的品牌名字段,而 { $regex: /a/ } 是指定MongoDB引擎在给定域中使用正则表达式去匹配所有的匹配项。也就是说,它将在品牌的名称中搜索任意位置包含’a’的文字。
11、查询某个日期之后添加的产品
db.product.find({ dateAdded : { $gte : new Date('your_date') } })
12、查询返回指定字段
根据name 模糊查询,返回指定字段
db.product.find( { name : /^Product/i }, {_id:0, name:1, price:1})
根据category 模糊查询,返回指定字段
db.product.find( { category : /^Clothing/i }, {_id:0, name:1, price:1})
这个查询将查找所有以"Clothing"开头的名字,并且只返回它们的名字和价格。具体而言,MongoDB会搜索满足{category : /^Clothing/i}的文档,也就是匹配category以"Clothing"开头的所有文档,然后再筛选出只有名字和价格的结果,忽略_id和其他字段,返回的数据结构如下:
实测案例:如下几种写法查询结果相同
db.product.find( { category : /^Clothing/i }, {_id:0, name:1, price:1,category:1})
db.product.find( { 'category' : /^Clothing/i }, {_id:0, name:1, price:1,category:1})
db.product.find( { "category" : /^Clothing/i }, {_id:0, name:1, price:1,category:1})
db.product.find( { "category" : /^Clothing/i }, {_id:0, name:1, price:1,"category":1})
13、要查询colorsAndSizes不为空的数据
db.product.find({"variants.colorsAndSizes.0":{$exists:true}})
这条命令会在MongoDB中查找那些拥有variants.colorsAndSizes中非空元素的文档,即使它可能是一个空对象或空数组也包括在内。
这是因为字段存在与否是最重要的标准,并且不考虑其具体内容。同样要注意的是,这个查询也不会返回那些未定义或者不存在variants字段的文档。
db.product.find({"variants.colorsAndSizes.2":{$exists:true}})
这条语句将查询product集合中variants.colorsAndSizes第3个元素存在的所有文档,即使它可能为空。
variants.colorsAndSizes.2是内嵌文档的第三个元素,$exists操作符用来判断该元素是否存在。如果存在,则返回该文档。如果不存在,则不会出现任何结果。这是一种避免查询有大量数据的简便方式,可以迅速缩小搜索范围。
建议仔细检查每个查询是否符合预期,以免意外排除了不应被排除的数据。
14、只想返回数组中的指定的属性
查询有user1评论的商品,并且返回指定字段
db.product.find( { "ratings.user" :"user1" }, {_id:0, name:1, price:1,category:1,ratings:1})
查询结果
{
"name": "Product 1",
"price": 9.99,
"category": "Electronics",
"ratings": [
{
"user": "user1",
"rating": 5,
"review": "This product is great!"
},
{
"user": "user2",
"rating": 3,
"review": "It's okay."
}
]
}
查询有user1评论的商品,并且返回指定字段【指定数组总返回那些字段】
db.product.find( { "ratings.user" :"user1" }, {_id:0, name:1, price:1,category:1,"ratings.user":1,"ratings.review":1})
查询结果
{
"name": "Product 1",
"price": 9.99,
"category": "Electronics",
"ratings": [
{
"user": "user1",
"review": "This product is great!"
},
{
"user": "user2",
"review": "It's okay."
}
]
}
15、关键字in的使用
案例:查询颜色包含蓝色和红色的数据
db.product.find({"variants.colorsAndSizes.color":{"$in":["blue","red"]}})
16、关键字nin的使用
db.product.find({"variants.colorsAndSizes.color":{"$nin":["blue","red"]}})
17、关键字in 和 nin结合使用
db.product.find({
"variants.colorsAndSizes.color": {
"$nin": ["blue", "red"]
},
"variants.colorsAndSizes.size": {
"$in": ["XS", "XL"]
}
})
18、关键字or使用
案例:查询 颜色有红色 尺码有XS的数据
db.product.find( { $or: [ { "variants.colorsAndSizes.color": "red" }, { "variants.colorsAndSizes.size":"XS" } ] } )
二选一满足都可以查询出来
19、关键字and使用
案例: 查询商品名称中包含 Product的,类目是"Electronics"的数据
db.product.find( { "name" : /Product/, "category" : "Electronics" })
20、正则表达式案例
两种语法都可以
db.product.find({"name": /Product/})
db.product.find({"name":{$regex:"Product"}})
忽略大小写
db.product.find({"category": /e/i})
db.product.find({"category":{$regex:"e",$options:"$i"}})
实战测试脚本
如果大家本地有MongoDB数据库的,可以直接导入如下脚本,希望我的分享对大家初学有帮助,欢迎点赞留言交流!
db.getCollection("product").insert( {
"_id": ObjectId("5a934e000102030405000000"),
"name": "Product 1",
"description": "A description of Product 1",
"price": 9.99,
"category": "Electronics",
"imageURL": "http://example.com/product1.jpg",
"variants": {
"colorsAndSizes": [
{ "color": "red", "size": "S" },
{ "color": "blue", "size": "M" },
{ "color": "green", "size": "L" }
]
},
"brand": {
"name": "Brand X",
"url": "http://www.brandx.com"
},
"ratings": [
{
"user": "user1",
"rating": 5,
"review": "This product is great!"
},
{
"user": "user2",
"rating": 3,
"review": "It's okay."
}
],
"numReviews": 2,
"dateAdded": ISODate("2023-07-01T00:00:00Z")
})
db.getCollection("product").insert({
"_id": ObjectId("5a934e000102030405000002"),
"name": "Product 2",
"description": "A description of Product 2",
"price": 19.99,
"category": "Clothing",
"imageURL": "http://example.com/product2.jpg",
"variants": {
"colorsAndSizes": [
{ "color": "black", "size": "XS" },
{ "color": "white", "size": "XL" }
]
},
"brand": {
"name": "Brand Y",
"url": "http://www.brandy.com"
},
"ratings": [
{
"user": "user3",
"rating": 4,
"review": "Good quality clothing!"
},
{
"user": "user4",
"rating": 2,
"review": "Runs small, order up one size!"
}
],
"numReviews": 2,
"dateAdded": ISODate("2023-07-02T00:00:00Z")
})
db.getCollection("product").insert({
"_id": ObjectId("5a934e000102030405000003"),
"name": "Product 3",
"description": "A description of Product 3",
"price": 29.99,
"category": "Home Goods",
"imageURL": "http://example.com/product3.jpg",
"variants": {
"colorsAndSizes": [
{ "color": "beige", "size": "18x18" },
{ "color": "gray", "size": "20x20" }
]
},
"brand": {
"name": "Brand Z",
"url": "http://www.brandz.com"
},
"ratings": [
{
"user": "user5",
"rating": 5,
"review": "High quality pillows! Perfect for my living room."
},
{
"user": "user6",
"rating": 3,
"review": "Nice pillows, but arrived with some damage to the packaging."
}
],
"numReviews": 2,
"dateAdded": ISODate("2023-07-03T00:00:00Z")
})
db.getCollection("product").insert({
"_id": ObjectId("5a934e000102030405000004"),
"name": "Product 4",
"description": "A description of Product 4",
"price": 49.99,
"category": "Books",
"imageURL": "http://example.com/product4.jpg",
"variants": {
"colorsAndSizes": []
},
"brand": {
"name": "Publisher A",
"url": "http://www.publishera.com"
},
"ratings": [
{
"user": "user7",
"rating": 5,
"review": "Great read! Highly recommend it to anyone interested in this subject matter."
},
{
"user": "user8",
"rating": 2,
"review": "Didn't really enjoy it. Found it slow and uninteresting."
}
],
"numReviews": 2,
"dateAdded": ISODate("2023-07-04T00:00:00Z")
})
db.getCollection("product").insert({
"_id": ObjectId("5a934e000102030405000005"),
"name": "Product 5",
"description": "A description of Product 5",
"price": 79.99,
"category": "Kitchen Appliances",
"imageURL": "http://example.com/product5.jpg",
"variants": {
"colorsAndSizes": [
{ "color": "stainless steel", "size": "large" },
{ "color": "black stainless steel", "size": "medium" }
]
},
"brand": {
"name": "Brand B",
"url": "http://www.brandb.com"
},
"ratings": [
{
"user": "user9",
"rating": 4,
"review": "Works well, does what it says it will do."
},
{
"user": "user10",
"rating": 3,
"review": "Decent product, but a bit overpriced for what you get."
}
],
"numReviews": 2,
"dateAdded": ISODate("2023-07-05T00:00:00Z")
})