mongodb 的 IntelliShell 的简单操作

向一个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;
    }
}

注意:

  1. lookup是如果涉及关联"_id",注意两个字段的类型,用string类型匹配ObjectId类型是没有结果的
  2. _class字段也是有些作用的,比如说使用$sum时用作分组
  3. 数据处理后续: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)}
    }
)

你可能感兴趣的:(mongodb 的 IntelliShell 的简单操作)