查询2017年以前的数据:
db.xxCollection.find({\"大众uploadDate\"大众:{$lt:new Date(2017,1,1)}});
(>) 大于 - $gt

(<) 小于 - $lt
(>=) 大于即是 - $gte
(<= ) 小于即是 - $lte
$in
db.xxCollection.find( { status: { $in: [ \"大众A\公众, \"大众D\公众 ] } } )
相称于sql的in
$or
db.xxCollection.find( { $or: [ { status: \"大众A\公众 }, { qty: { $lt: 30 } } ] } )
$and也有,不过什么都不加便是and的意思,以是一样平常用不到
排序:
db.xxCollection.find({\"大众uploadDate\"大众:{$lte:new Date(2017,1,1)}).sort({\公众uploadDate\"大众:-1});
表示按uploadDate降序排列
限定返回值:
db.fs.files.find({\"大众uploadDate\"大众:{$lte:new Date(2017,1,1)}},{\公众filename\"大众:1}).sort({\公众uploadDate\"大众:-1});
这样会返回filename。1表示返回,0是不返回
但是_id是默认返回的,以是这条语句会返回两个字段
db.fs.files.find({\公众uploadDate\"大众:{$lte:new Date(2017,1,1)}},{\公众filename\"大众:1,\公众_id\公众:0}).sort({\"大众uploadDate\"大众:-1});
如果,特地指定哪个不返回,那么便是返回其他所有的
db.fs.files.find({\公众uploadDate\公众:{$lte:new Date(2017,1,1)}},{\"大众_id\"大众:0}).sort({\"大众uploadDate\"大众:-1});
会返回除_id外的所有字段
关联查询这个语法有点麻烦
须要用到聚合函数中的 $lookup
$lookup的语法
{ $lookup: { from: <要关联的凑集>, localField: <当前的凑集的字段>, foreignField: <要关联的凑集的字段>, as: <返回的字段名> }}
举例:
订单表:
db.orders.insert([ { \公众_id\"大众 : 1, \"大众item\公众 : \"大众almonds\公众, \"大众price\"大众 : 12, \"大众quantity\公众 : 2 }, { \"大众_id\"大众 : 2, \公众item\"大众 : \"大众pecans\"大众, \"大众price\"大众 : 20, \公众quantity\"大众 : 1 }, { \"大众_id\"大众 : 3 }])
商品表:
db.inventory.insert([ { \"大众_id\公众 : 1, \"大众sku\"大众 : \"大众almonds\公众, description: \公众product 1\公众, \公众instock\公众 : 120 }, { \公众_id\"大众 : 2, \"大众sku\公众 : \公众bread\"大众, description: \"大众product 2\"大众, \"大众instock\公众 : 80 }, { \"大众_id\"大众 : 3, \"大众sku\"大众 : \公众cashews\公众, description: \"大众product 3\"大众, \"大众instock\"大众 : 60 }, { \公众_id\"大众 : 4, \"大众sku\公众 : \公众pecans\"大众, description: \"大众product 4\"大众, \公众instock\公众 : 70 }, { \公众_id\"大众 : 5, \"大众sku\"大众: null, description: \公众Incomplete\公众 }, { \公众_id\公众 : 6 }])
根据订单的item关联查询出商品信息:
db.orders.aggregate([ { $lookup: { from: \公众inventory\"大众, localField: \公众item\"大众, foreignField: \公众sku\公众, as: \"大众inventory_docs\"大众 } }])
相称于sql中:
SELECT , inventory_docsFROM ordersWHERE inventory_docs IN (SELECT FROM inventoryWHERE sku= orders.item);
返回的结果:
{ \公众_id\"大众 : 1, \"大众item\"大众 : \公众almonds\"大众, \"大众price\"大众 : 12, \公众quantity\公众 : 2, \"大众inventory_docs\公众 : [ { \"大众_id\"大众 : 1, \公众sku\公众 : \"大众almonds\"大众, \"大众description\"大众 : \公众product 1\"大众, \"大众instock\"大众 : 120 } ]}{ \"大众_id\"大众 : 2, \"大众item\"大众 : \公众pecans\公众, \"大众price\公众 : 20, \"大众quantity\公众 : 1, \"大众inventory_docs\"大众 : [ { \公众_id\"大众 : 4, \公众sku\"大众 : \"大众pecans\"大众, \"大众description\"大众 : \公众product 4\公众, \"大众instock\"大众 : 70 } ]}{ \公众_id\公众 : 3, \"大众inventory_docs\"大众 : [ { \公众_id\"大众 : 5, \"大众sku\公众 : null, \公众description\"大众 : \"大众Incomplete\公众 }, { \"大众_id\"大众 : 6 } ]}
增加查询条件:$match
查询订单金额大于10的
db.orders.aggregate([ { $lookup: { from: \"大众inventory\"大众, localField: \"大众item\公众, foreignField: \公众sku\公众, as: \"大众inventory_docs\公众 } }, { $match: { \"大众price\公众: {$gt:10} } }])
$match实行的比较,是基于lookup的结果来的
将\"大众price\"大众: {$gt:10}换成“inventory_docs.instock\公众: {$gt:100}
查询库存大于100的
指定返回字段$project
{ $project:{ \公众inventory_docs\"大众: 1, \公众item\"大众: 1, \公众_id\"大众: 0 } }
汇总起来:
db.orders.aggregate([ { $lookup: { from: \"大众inventory\公众, localField: \"大众item\公众, foreignField: \"大众sku\"大众, as: \"大众inventory_docs\"大众 } }, { $match: { \"大众inventory_docs.instock\公众: {$gt:100} } }, { $project:{ \"大众inventory_docs\公众: 1, \公众item\"大众: 1, \"大众_id\"大众: 0 } }])
返回:
{ \"大众item\"大众 : \"大众almonds\"大众, \公众inventory_docs\公众 : [ { \"大众_id\"大众 : 1, \公众sku\"大众 : \"大众almonds\"大众, \公众description\"大众 : \"大众product 1\公众, \"大众instock\"大众 : 120 } ] }删除
每次在数据库上做删除操作,我都很紧张。就怕搞错了条件语句。
db.xxCollection.deleteOne({条件})
db.xxCollection.deleteMany({条件})
db.collection.findOneAndDelete({条件},{排序})
可以加排序字段,用来限定删除哪个元素,如
db.scores.findOneAndDelete({ \"大众name\公众 : \"大众A. MacDyver\"大众 },{ sort : { \公众points\公众 : 1 } })
提醒:
1,任何时候delete语句都要有条件
2,删除前,先用find语句查一查,不要怕麻烦
关于mongo删除操作的几点解释:
1,删除documents不会删除索引,纵然是删了所有的documents
2,原子性。所有的写操作在mongo中都是原子性的