如何防范攻击

  • 1.做好访问认证,打开你的MongoDB配置文件(.conf),设置为auth=true
  • 2.做好防火墙的设置,建议管理者关闭27017端口的访问
  • 3.Bind_ip 绑定内网ip访问
  • 4.做好升级,请管理者将软件升级到最新版

SpringBoot中MongoDB注解概念及使用

  • 1.@Id
    主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。如果自己不设置@Id主键,mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。
  • 2.@Document
    标注在实体类上,类似于hibernate的entity注解,标明由mongo来维护该表。
  • 3.@Indexed
    声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
    唯一索引的话是@Indexed(unique = true)。
    也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。
    也可以对整个Document进行索引,排序是预定义的按插入BSON数据的先后升序排列。
    也可以对关联的对象的字段进行索引,譬如User对关联的address.city进行索引。
  • 4.@CompoundIndexes
    复合索引,加复合索引后通过复合索引字段查询将大大提高速度。
@Document
@CompoundIndexes({
    @CompoundIndex(name="name_city", def="{'name':1, 'city':-1}" )
})
public class User{
}

写法如上,name和city将作为复合索引,数字参数指定索引的方向,1为正序,-1为倒序。方向对单键索引和随机存不要紧,但如果你要执行分组和排序操作的时候,它就非常重要了。

  • 5.@Field
    代表一个字段,可以不加,不加的话默认以参数名为列名。
  • 6.@Transient
    被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。
  • 7.@DBRef
    在使用mongdb的时候经常会遇到一个集合嵌套了另一个集合的情况,如果不用引用的话,就得自己手动写代码冗余数据,修改的时候就比较麻烦,要同时修改多处。用mongodb提供的$ref 能很好的解决这个问题
    首先写个例子
@Document
public class Department{
    private String id;
    private String name;
    @DBRef
    private People leader;
}

@Document
public class People{
    private String id;
    private String name;
    private Integer age;
}

每个部门都需要个领导leader,这个时候用外键非常合适使用很简单,只要在要用到外键的字段上,加上@DBRef就可以了。先创建个People集合,保存写people信息,然后再创建Department集合,可以发现Department存储的时候leader变成了一个引用类型。

{ 
    "_id" : ObjectId("5b10a741628e881fc8848d21"), 
    "name" : "财政部",
    "leader" : DBRef("People", ObjectId("5b0cf065fde29f25486bf532")), 
}

那么查询的时候,如果要根据leader查询班级怎么办,@DBRef的查询也非常简单。

public Department findByLeaderId(String leaderId) {
    return mongoOperations.findOne(
            query(where("leader.$id").is(new ObjectId(leaderId))),
            GhostFriend.class);
}

这里注意2个地方,第一个就是引用的时候要加上$id,这样才能表示此id是引用,第二个地方就是new ObjectId() 在自定义复杂查询哪里有提到为什么要new ObjectId()。

  • 8.@Query
    通过将org.springframework.data.mongodb.repository.Query注释添加到存储库查询方法,您可以指定要使用的MongoDB JSON查询字符串,而不是从方法名称派生查询。
public interface PersonRepository extends MongoRepository<Person, String>

  @Query(value="{ 'firstname' : ?0 }", fields="{ 'firstname' : 1, 'lastname' : 1}")
  List<Person> findByThePersonsFirstname(String firstname);

}
  • 9.@GeoSpatialIndexed:
    应用于现场级别来描述如何对该字段进行地理索引。
在新的mongodb1.9之后mongodb支持新的注解
  • 10.@TextIndexed
    应用于字段级别以标记要包含在文本索引中的字段。
  • 11.@TextScore
    一旦实体包含@TextScore注释属性,就可以检索文档的全文分数