MongoDB查询特定条件文档:给定文档结构下的查询需求
没问题!我来给你一步步拆解如何针对你提供的这款商品MongoDB文档,查询满足各种特定条件的文档。先回顾下你的文档结构方便参考:
{
"id" : ObjectId("598c00090ec35f5dd3dc508a"),
"type" : "Wear",
"kind" : "Shoes",
"brand" : "Free People",
"article" : "6718_brown",
"grander" : "m",
"size" : { "39" : 1, "44" : 0, "45" : 6 },
"rsp" : 3400,
"price" : 873,
"createdAt" : ISODate("2017-08-10T06:41:13.294Z"),
"images" : [ "6718_bezhevye!_1.jpg", ... ],
"__v" : 0
}
1. 基础等值查询
最常用的就是匹配某个字段的具体值,比如:
- 查询所有类型为
Wear的商品:
db.yourCollectionName.find({ type: "Wear" })
(记得把yourCollectionName换成你实际的集合名)
- 查询品牌是
Free People的鞋子:
db.yourCollectionName.find({ brand: "Free People", kind: "Shoes" })
2. 嵌套字段(size对象)查询
因为size是嵌套对象,查询时要用点符号指定具体的子字段:
- 查询39码有库存(数量>0)的商品:
db.yourCollectionName.find({ "size.39": { $gt: 0 } })
这里$gt是MongoDB的比较运算符,表示“大于”。
- 查询45码库存等于6的商品:
db.yourCollectionName.find({ "size.45": 6 })
3. 数值范围查询
针对price、rsp这类数值字段,用比较运算符做范围筛选:
- 查询售价在500到1000之间的商品:
db.yourCollectionName.find({ price: { $gte: 500, $lte: 1000 } })
$gte表示“大于等于”,$lte表示“小于等于”。
- 查询建议零售价(rsp)大于2000的商品:
db.yourCollectionName.find({ rsp: { $gt: 2000 } })
4. 数组字段(images)查询
针对images数组,有几种常见的查询方式:
- 查询包含指定图片的商品:
db.yourCollectionName.find({ images: "6718_bezhevye_!_1.jpg" })
MongoDB默认会匹配数组中包含该值的文档。
- 查询图片数量大于3的商品:
db.yourCollectionName.find({ $expr: { $gt: [ { $size: "$images" }, 3 ] } })
(注:$size不支持直接用范围运算符,所以需要结合$expr来实现)
5. 日期范围查询
针对createdAt日期字段,筛选特定时间段的文档:
- 查询2017年8月1日之后创建的商品:
db.yourCollectionName.find({ createdAt: { $gte: ISODate("2017-08-01T00:00:00Z") } })
- 查询2017年8月10日当天创建的商品:
db.yourCollectionName.find({ createdAt: { $gte: ISODate("2017-08-10T00:00:00Z"), $lt: ISODate("2017-08-11T00:00:00Z") } })
6. 多条件组合查询
用$and、$or来组合多个条件:
- 查询品牌是Free People,且售价低于1000,且39码有库存的商品:
db.yourCollectionName.find({ brand: "Free People", price: { $lt: 1000 }, "size.39": { $gt: 0 } })
(多个条件直接写在对象里默认就是$and逻辑)
- 查询要么是Shoes类型,要么售价低于500的商品:
db.yourCollectionName.find({ $or: [ { kind: "Shoes" }, { price: { $lt: 500 } } ] })
如果还有更特殊的查询需求,随时告诉我具体条件,我再帮你调整语法~
内容的提问来源于stack exchange,提问作者Juff

