向一个collections中添加一个字段
道德三皇五帝,功名夏后商周,
五霸七雄闹春秋,顷刻兴亡过手。
青史几行名姓,北邙无数荒丘,
前人田地后人收,说甚龙争虎斗。
注意:Studio 3T 在使用 IntelliShell 功能时,需要先点进去一个集和在使用这个功能
添加一个字段还不影响原来集合中的字段要使用Update语句,往journal_dataset_zh表中添加一个collects字段为int类型,默认为0。
db.journal_dataset_zh.update({}, {$set: {collects: NumberInt(0)}}, {multi: 1})
往journal_dataset_zh表中添加一个collects字段为long类型,默认为0。
db.journal_dataset_zh.update({}, {$set: {collects: NumberLong(0)}}, {multi: 1})
往journal_dataset_zh表中添加一个collects字段为小数类型,默认为0.0。
db.journal_dataset_zh.update({}, {$set: {collects: 0}}, {multi: 1})
往journal_dataset_zh表中添加一个collects字段为字符串类型,默认为"0"。
db.journal_dataset_zh.update({}, {$set: {"collects": "0"}}, {multi: 1})
往journal_dataset_zh表中添加一个updateDate字段为日期类型,为当前时间。
db.journal_dataset_zh.update({}, {$currentDate: {updateDate: true}},{multi: 1})
注意:{multi: 1} 这个属性为表中所有记录全部更新
删除metadata_15732集合中 'status'字段等于0的所有数据
db.metadata_15732.remove({'status':0})
mongodb如何实现更新一个字段的值为另外一个字段的值?
其中totalSize是有数据的字段,size是想新增的字段并且值为totalSize的值:
db.journal_file.find().forEach(function(item){
db.journal_file.update({"_id":item._id},
{"$set": {"size":item.totalSize}},false,true)
})
例如要把journal_file表中totalSize字段删除
db.journal_file.update({},{$unset:{'totalSize':''}},false, true)
mongodb多表关联查询
{$lookup:{from:"orders",localField:"_id",foreignField:"uid",as:"orders"}},
{$unwind:"$orders"},
{$match:{name:"小明","orders.produce":"产品2"}},
{$project:{name:"$name",age:"$age",produce:"$orders.produce",money:"$orders.money"}}])
db.project_dataset_zh.aggregate([
{$lookup:{from:"sdb_project",localField:"projectId",foreignField:"projectId",as:"orders"}},
{$unwind:"$orders"},
{$project:{code:"$orders.code",dataSetId:"$dataSetId",dataSetCode:"$dataSetCode",title:"$title"}}
])
mongodb的多表查询比较简单,使用$lookup关键字即可:
参数解释:
form:需要关联的外表名;
lookup的多变查询使用的是左外连接;
localField:本表的外表关联字段;
foreignField:外表的关联字段;
as:参考查询结果,使用$lookup进行查询后会将所有符合条件的文档封装为一个list,as参数定义这个list的名字;
$unwind的作用是将文档中的数组拆分为多条,拆分结果为:
数据过滤:
现在可以对数据进行过滤,数据过滤的步骤应该尽可能提前,但如果过滤条件中也需要筛选外表条件的话就没办法放前面了,过滤在聚合中使用$match
如果对字段结果有要求可以使用project进行字段筛选:再聚合中$可以用作引用相应字段的值
使用spring-data-mongodb在dao层的代码
@Repository("aggregateDao")
public class AggregateDaoImpl implements IAggregateDao {
@Autowired
private MongoTemplate mongoTemplate;
public AggregationResults aggregateLookup() {
// 创建条件
AggregationOperation lookup = Aggregation.lookup("orders", "_id", "uid", "orders");
AggregationOperation unwind = Aggregation.unwind("orders");
AggregationOperation match = Aggregation.match(Criteria.where("name").is("小明").and("orders.produce").is("产品2"));
AggregationOperation project = Aggregation.project("name", "age", "orders.produce", "orders.money");
// 将条件封装到Aggregate管道
Aggregation aggregation = Aggregation.newAggregation(lookup, unwind, match, project);
// 查询
AggregationResults aggregate = mongoTemplate.aggregate(aggregation, "user", Document.class);
return aggregate;
}
}
注意:
- lookup是如果涉及关联"_id",注意两个字段的类型,用string类型匹配ObjectId类型是没有结果的
- _class字段也是有些作用的,比如说使用$sum时用作分组
- 数据处理后续:Document返回的值,如果用作前端返回,ObjectId是会被当成BSON解析的
MongoDB 按照portEntry字段分组查询(Group)并统计每个分组个数
db.getCollection("certification_batch_info").aggregate({$group:{_id:"$portEntry",count:{$sum:1}}})
修改流转信息表中sourceTpye 不等于口岸,status is null的数据,改成status =0,pending=1
db.import_export_statistical.updateMany(
{
sourceTpye: {$ne : "口岸"},
status: null
},
{
$set: {"status": NumberInt(0), "pending": NumberInt(1)}
}
)