国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

SpringBoot整合MongoDB的完整操作指南

 更新時間:2026年02月10日 08:59:29   作者:J_liaty  
在實際項目開發(fā)中,合理封裝MongoDB的操作工具類,可以大幅提升代碼復(fù)用性和維護(hù)性,本文將帶你從零開始實現(xiàn)一個功能完善的MongoDB工具類,涵蓋基礎(chǔ)CRUD和高級查詢功能,需要的朋友可以參考下

依賴配置

pom.xml 中添加以下依賴:

<dependencies>
    <!-- SpringBoot Starter MongoDB -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    
    <!-- Lombok (可選,簡化實體類) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    
    <!-- Hutool工具包 (可選) -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.18</version>
    </dependency>
</dependencies>

配置文件

application.yml 中配置MongoDB連接信息:

基礎(chǔ)配置(使用URI方式)

spring:
  data:
    mongodb:
      # MongoDB連接URI
      # 格式:mongodb://[username:password@]host:port/database
      # 示例說明:
      # - mongodb://localhost:27017:本地MongoDB,默認(rèn)端口27017
      # - mongodb://admin:123456@localhost:27017:帶用戶名密碼的連接
      # - mongodb://host1:27017,host2:27017:連接副本集
      uri: mongodb://localhost:27017
      
      # 數(shù)據(jù)庫名稱
      # 說明:指定要使用的MongoDB數(shù)據(jù)庫
      # 注意:數(shù)據(jù)庫不存在時會自動創(chuàng)建
      database: my_database
      
      # 自動創(chuàng)建索引
      # 說明:啟動時自動為實體類上的@Indexed注解創(chuàng)建索引
      # 優(yōu)點:開發(fā)環(huán)境方便,自動創(chuàng)建索引
      # 缺點:生產(chǎn)環(huán)境可能影響啟動速度
      # 建議:生產(chǎn)環(huán)境設(shè)置為false,手動管理索引
      auto-index-creation: true

完整配置(詳細(xì)配置方式)

spring:
  data:
    mongodb:
      # ==================== 連接基礎(chǔ)配置 ====================
      
      # MongoDB服務(wù)器地址
      # 說明:可以是IP地址或域名
      # 示例:
      # - localhost:本地連接
      # - 192.168.1.100:指定IP地址
      # - mongodb.example.com:域名連接
      host: localhost
      
      # MongoDB服務(wù)器端口
      # 說明:MongoDB默認(rèn)端口為27017
      # 注意:確保端口沒有被防火墻阻止
      port: 27017
      
      # 數(shù)據(jù)庫名稱
      # 說明:指定要連接的數(shù)據(jù)庫名稱
      database: my_database
      
      # ==================== 認(rèn)證配置 ====================
      
      # 用戶名
      # 說明:如果MongoDB啟用了認(rèn)證,需要提供用戶名
      # 注意:用戶必須有對應(yīng)數(shù)據(jù)庫的訪問權(quán)限
      # 示例:admin用戶通常是管理員賬戶
      username: admin
      
      # 密碼
      # 說明:對應(yīng)用戶名的密碼
      # 安全建議:
      # - 生產(chǎn)環(huán)境不要明文存儲密碼
      # - 建議使用環(huán)境變量或加密配置
      # - 示例:${MONGODB_PASSWORD:admin123}
      password: admin123
      
      # 認(rèn)證數(shù)據(jù)庫
      # 說明:用戶認(rèn)證信息存儲的數(shù)據(jù)庫
      # 默認(rèn)值:admin
      # 注意:大多數(shù)用戶的認(rèn)證信息存儲在admin數(shù)據(jù)庫中
      authentication-database: admin
      
      # ==================== 索引配置 ====================
      
      # 自動創(chuàng)建索引
      # 說明:應(yīng)用啟動時自動創(chuàng)建索引
      # 開發(fā)環(huán)境:建議設(shè)置為true,方便開發(fā)
      # 生產(chǎn)環(huán)境:建議設(shè)置為false,手動管理索引更安全
      # 原因:
      # - 生產(chǎn)環(huán)境索引創(chuàng)建可能影響性能
      # - 可以提前規(guī)劃好索引,避免運(yùn)行時創(chuàng)建
      auto-index-creation: true
      
      # ==================== 連接池配置 ====================
      
      # 每個主機(jī)最小連接數(shù)
      # 說明:連接池中保持的最小連接數(shù)量
      # 作用:避免頻繁創(chuàng)建和銷毀連接的開銷
      # 建議:
      # - 低負(fù)載應(yīng)用:5-10
      # - 中等負(fù)載應(yīng)用:10-20
      # - 高負(fù)載應(yīng)用:20-50
      min-connections-per-host: 10
      
      # 每個主機(jī)最大連接數(shù)
      # 說明:連接池中允許的最大連接數(shù)量
      # 作用:限制并發(fā)連接數(shù),防止資源耗盡
      # 建議:
      # - 根據(jù)應(yīng)用并發(fā)量設(shè)置
      # - 一般設(shè)置為CPU核心數(shù)的2-4倍
      # - 例如:8核CPU可以設(shè)置為32-100
      max-connections-per-host: 100
      
      # 連接線程阻塞倍數(shù)
      # 說明:允許等待連接的最大線程數(shù)
      # 計算公式:max-connections-per-host × multiplier
      # 示例:100 × 5 = 500個線程可以等待連接
      # 作用:當(dāng)連接池耗盡時,允許一定數(shù)量的線程等待
      # 建議:一般設(shè)置為3-5倍
      threads-allowed-to-block-for-connection-multiplier: 5
      
      # 連接超時時間(毫秒)
      # 說明:獲取連接的最大等待時間
      # 默認(rèn)值:10000毫秒(10秒)
      # 作用:防止線程無限等待連接
      # 建議:
      # - 開發(fā)環(huán)境:5000-10000毫秒
      # - 生產(chǎn)環(huán)境:根據(jù)響應(yīng)時間要求調(diào)整
      # - 網(wǎng)絡(luò)不穩(wěn)定時可以適當(dāng)增加
      connection-timeout: 10000
      
      # Socket超時時間(毫秒)
      # 說明:Socket讀寫操作的超時時間
      # 默認(rèn)值:0(表示無超時,永久等待)
      # 作用:防止網(wǎng)絡(luò)故障導(dǎo)致請求掛起
      # 建議:
      # - 簡單查詢:30000-60000毫秒(30-60秒)
      # - 復(fù)雜查詢:120000毫秒(120秒)或更長
      # - 注意:超時時間要根據(jù)實際業(yè)務(wù)需求設(shè)置
      socket-timeout: 60000
      
      # ==================== 其他可選配置 ====================
      
      # 編解碼器(可選)
      # 說明:指定MongoDB驅(qū)動使用的編解碼器
      # 默認(rèn)值:org.bson.codecs.DocumentCodec
      # 用途:自定義文檔的編碼解碼邏輯
      # codec: com.example.mongodb.CustomCodec
      
      # UUID表示方式(可選)
      # 說明:UUID類型在MongoDB中的存儲格式
      # 可選值:
      # - JAVA_LEGACY:Java的傳統(tǒng)格式(3.0之前)
      # - STANDARD:標(biāo)準(zhǔn)格式(推薦)
      # - C_SHARP_LEGACY:C#的傳統(tǒng)格式
      # - PYTHON_LEGACY:Python的傳統(tǒng)格式
      # uuid-representation: STANDARD
      
      # 副本集名稱(可選)
      # 說明:連接副本集時指定的副本集名稱
      # 用途:連接副本集時必須指定
      # 示例:replica-set-name
      # replica-set-name: myReplicaSet
      
      # 讀取偏好(可選)
      # 說明:指定讀取數(shù)據(jù)的首選節(jié)點
      # 可選值:
      # - primary:只從主節(jié)點讀?。J(rèn))
      # - primaryPreferred:優(yōu)先從主節(jié)點讀取
      # - secondary:只從從節(jié)點讀取
      # - secondaryPreferred:優(yōu)先從從節(jié)點讀取
      # - nearest:從最近節(jié)點讀取
      # read-preference: secondaryPreferred
      
      # 寫關(guān)注級別(可選)
      # 說明:指定寫入操作的安全級別
      # 可選值:
      # - ACKNOWLEDGED:默認(rèn),確認(rèn)寫入主節(jié)點
      # - W1:確認(rèn)寫入主節(jié)點和一個從節(jié)點
      # - W2:確認(rèn)寫入主節(jié)點和兩個從節(jié)點
      # - MAJORITY:確認(rèn)寫入大多數(shù)節(jié)點
      # - UNACKNOWLEDGED:不等待確認(rèn),性能最好但不安全
      # write-concern: ACKNOWLEDGED

多環(huán)境配置示例

開發(fā)環(huán)境配置(application-dev.yml)

spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      database: dev_database
      username: dev_user
      password: dev_password
      auto-index-creation: true
      # 開發(fā)環(huán)境連接池配置較小
      min-connections-per-host: 5
      max-connections-per-host: 20
      connection-timeout: 10000
      socket-timeout: 30000

測試環(huán)境配置(application-test.yml)

spring:
  data:
    mongodb:
      host: test-mongodb.example.com
      port: 27017
      database: test_database
      username: test_user
      password: ${MONGODB_TEST_PASSWORD}
      auto-index-creation: false
      # 測試環(huán)境連接池配置中等
      min-connections-per-host: 10
      max-connections-per-host: 50
      connection-timeout: 10000
      socket-timeout: 60000

生產(chǎn)環(huán)境配置(application-prod.yml)

spring:
  data:
    mongodb:
      # 生產(chǎn)環(huán)境使用URI方式連接副本集
      uri: mongodb://${MONGODB_USER}:${MONGODB_PASSWORD}@mongo1.example.com:27017,mongo2.example.com:27017,mongo3.example.com:27017/${MONGODB_DATABASE}?replicaSet=prodReplicaSet&connectTimeoutMS=10000&socketTimeoutMS=60000
      
      auto-index-creation: false
      
      # 生產(chǎn)環(huán)境連接池配置較大
      min-connections-per-host: 20
      max-connections-per-host: 100
      threads-allowed-to-block-for-connection-multiplier: 5
      connection-timeout: 10000
      socket-timeout: 60000
      
      # 生產(chǎn)環(huán)境使用副本集,配置讀取偏好和寫關(guān)注
      # read-preference: secondaryPreferred
      # write-concern: MAJORITY

配置參數(shù)詳解

連接池參數(shù)對比表

參數(shù)說明推薦值(小應(yīng)用)推薦值(大應(yīng)用)調(diào)優(yōu)建議
min-connections-per-host最小連接數(shù)5-1020-50根據(jù)平均并發(fā)量設(shè)置
max-connections-per-host最大連接數(shù)20-50100-200根據(jù)峰值并發(fā)量設(shè)置
threads-allowed-to-block-for-connection-multiplier阻塞倍數(shù)55一般不需要調(diào)整
connection-timeout連接超時(ms)1000010000網(wǎng)絡(luò)不穩(wěn)定時可增加
socket-timeoutSocket超時(ms)30000-6000060000-120000根據(jù)查詢復(fù)雜度調(diào)整

常見問題與解決方案

1. 連接超時問題

現(xiàn)象:應(yīng)用啟動或查詢時頻繁出現(xiàn)連接超時

解決方案

spring:
  data:
    mongodb:
      # 增加連接超時時間
      connection-timeout: 20000
      # 增加Socket超時時間
      socket-timeout: 120000
      # 增加連接池大小
      max-connections-per-host: 200

2. 副本集連接問題

現(xiàn)象:連接副本集時出現(xiàn)"not master and slaveOk=false"錯誤

解決方案

spring:
  data:
    mongodb:
      # 使用URI方式連接副本集
      uri: mongodb://user:pass@host1:27017,host2:27017,host3:27017/database?replicaSet=myReplicaSet&readPreference=secondaryPreferred

3. 認(rèn)證失敗問題

現(xiàn)象:認(rèn)證失敗,無法連接數(shù)據(jù)庫

解決方案

spring:
  data:
    mongodb:
      username: your_username
      password: your_password
      authentication-database: admin  # 確保指定正確的認(rèn)證數(shù)據(jù)庫

安全建議

密碼安全

  • 不要在配置文件中明文存儲密碼
  • 使用環(huán)境變量:${MONGODB_PASSWORD}
  • 使用加密配置中心

網(wǎng)絡(luò)安全

  • 生產(chǎn)環(huán)境不要使用localhost
  • 使用內(nèi)網(wǎng)IP或VPN
  • 配置MongoDB的防火墻規(guī)則

權(quán)限控制

  • 為不同環(huán)境創(chuàng)建不同的數(shù)據(jù)庫用戶
  • 遵循最小權(quán)限原則
  • 定期更換密碼

核心工具類實現(xiàn)

1. 響應(yīng)結(jié)果封裝類

package com.example.mongodb.common;

import lombok.Data;
import java.io.Serializable;

/**
 * 統(tǒng)一響應(yīng)結(jié)果封裝
 */
@Data
public class Result<T> implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private Integer code;
    private String message;
    private T data;
    private Long total;
    
    public Result() {
    }
    
    public Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "操作成功", data);
    }
    
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(200, message, data);
    }
    
    public static <T> Result<T> error(String message) {
        return new Result<>(500, message, null);
    }
    
    public static <T> Result<T> error(Integer code, String message) {
        return new Result<>(code, message, null);
    }
    
    public Result<T> total(Long total) {
        this.total = total;
        return this;
    }
}

2. 分頁請求參數(shù)類

package com.example.mongodb.common;

import lombok.Data;

/**
 * 分頁請求參數(shù)
 */
@Data
public class PageRequest {
    
    /** 當(dāng)前頁碼 */
    private Integer pageNum = 1;
    
    /** 每頁條數(shù) */
    private Integer pageSize = 10;
    
    /** 排序字段 */
    private String sortField;
    
    /** 排序方式:asc/desc */
    private String sortOrder = "asc";
    
    public PageRequest() {
    }
    
    public PageRequest(Integer pageNum, Integer pageSize) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
    }
    
    public int getSkip() {
        return (pageNum - 1) * pageSize;
    }
}

3. 核心MongoDB工具類(詳細(xì)注釋版)

package com.example.mongodb.utils;

import com.example.mongodb.common.PageRequest;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.regex.Pattern;

/**
 * MongoDB工具類 - 提供完整的CRUD操作和高級查詢功能
 * 
 * ========================================
 * 使用說明:
 * ========================================
 * 1. 使用泛型<T>支持任意實體類型
 * 2. 基于MongoTemplate實現(xiàn),提供了豐富的封裝方法
 * 3. 支持事務(wù)、聚合、批量操作等高級特性
 * 4. 所有方法都有詳細(xì)注釋,方便理解和使用
 * 
 * @author 作者
 * @date 2026-02-09
 */
@Slf4j
@Component
public class MongoUtils<T> {
    
    // ==================== 核心依賴注入 ====================
    
    /**
     * MongoDB操作模板
     * 說明:Spring Data MongoDB的核心類,提供了對MongoDB數(shù)據(jù)庫的所有操作
     * 使用場景:執(zhí)行查詢、插入、更新、刪除等所有數(shù)據(jù)庫操作
     */
    @Autowired
    private MongoTemplate mongoTemplate;
    
    /**
     * 獲取集合名稱
     * 功能:根據(jù)實體類獲取對應(yīng)的MongoDB集合名稱(相當(dāng)于關(guān)系數(shù)據(jù)庫的表名)
     * 實現(xiàn)原理:通過@Document注解的collection屬性,或使用類名小寫形式
     * 
     * @param entityClass 實體類類型(帶@Document注解的類)
     * @return 集合名稱(MongoDB中的集合名,如"user"、"order"等)
     */
    private String getCollectionName(Class<?> entityClass) {
        return mongoTemplate.getCollectionName(entityClass);
    }
    
    // ==================== 基礎(chǔ)CRUD操作 ====================
    
    /**
     * 保存單個實體
     * 功能:保存或更新實體對象
     * 
     * 執(zhí)行邏輯:
     * 1. 如果實體對象包含_id字段且值不為空,則執(zhí)行更新操作(upsert)
     * 2. 如果實體對象不包含_id或_id為空,則執(zhí)行插入操作
     * 3. 插入成功后,MongoDB會自動生成ObjectId并賦值給_id字段
     * 
     * 使用場景:
     * - 新增數(shù)據(jù)時直接調(diào)用
     * - 修改數(shù)據(jù)時傳入包含_id的對象
     * 
     * @param entity 要保存的實體對象(必須包含@Document注解)
     * @return 保存后的實體對象(包含生成的_id)
     */
    public T save(T entity) {
        return mongoTemplate.save(entity);
    }
    
    /**
     * 批量保存實體
     * 功能:一次性保存多個實體對象,提高批量插入性能
     * 
     * 性能優(yōu)勢:
     * - 相比循環(huán)調(diào)用save()方法,批量操作可以減少網(wǎng)絡(luò)往返次數(shù)
     * - MongoDB支持批量插入,內(nèi)部優(yōu)化了寫入性能
     * 
     * 注意事項:
     * - 如果數(shù)據(jù)量很大(如超過10000條),建議分批插入
     * - 如果其中某個文檔插入失敗,整個操作可能會回滾
     * 
     * @param entities 實體集合(List、Set等Collection類型)
     * @return 保存后的實體集合(包含生成的_id)
     */
    public List<T> saveBatch(Collection<T> entities) {
        return (List<T>) mongoTemplate.insertAll(entities);
    }
    
    /**
     * 插入單個實體
     * 功能:直接插入實體,不檢查是否已存在
     * 
     * 與save()的區(qū)別:
     * - save():智能判斷是插入還是更新(基于_id)
     * - insert():強(qiáng)制插入,如果_id已存在會拋出DuplicateKeyException異常
     * 
     * 使用場景:
     * - 確保不會重復(fù)插入時使用
     * - 需要明確區(qū)分新增和更新操作時使用
     * 
     * @param entity 要插入的實體對象
     * @return 插入后的實體對象
     * @throws org.springframework.dao.DuplicateKeyException 如果_id已存在
     */
    public T insert(T entity) {
        return mongoTemplate.insert(entity);
    }
    
    /**
     * 批量插入實體
     * 功能:批量插入到指定集合中,適合大量數(shù)據(jù)初始化
     * 
     * 使用說明:
     * - 通過entityClass參數(shù)指定目標(biāo)集合
     * - 相比saveBatch(),此方法可以明確指定集合名稱
     * 
     * @param entities 實體集合
     * @param entityClass 實體類類型(用于確定集合名稱)
     * @return 插入后的實體集合
     */
    public List<T> insertBatch(Collection<T> entities, Class<T> entityClass) {
        return (List<T>) mongoTemplate.insert(entities, entityClass);
    }
    
    /**
     * 根據(jù)ID查詢實體
     * 功能:通過MongoDB的文檔ID(_id字段)精確查詢單個文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 構(gòu)造查詢條件:WHERE _id = ?
     * 2. 執(zhí)行查詢,返回匹配的第一個文檔
     * 3. 將文檔映射為Java實體對象
     * 
     * ID類型說明:
     * - MongoDB的_id默認(rèn)類型是ObjectId(24位十六進(jìn)制字符串)
     * - Spring Data MongoDB支持String、ObjectId、Long等多種類型
     * 
     * @param id 實體ID(通常是ObjectId類型或字符串)
     * @param entityClass 實體類類型(用于結(jié)果映射)
     * @return 查詢到的實體對象,不存在則返回null
     */
    public T findById(Object id, Class<T> entityClass) {
        return mongoTemplate.findById(id, entityClass);
    }
    
    /**
     * 查詢所有實體
     * 功能:查詢集合中的所有文檔
     * 
     * 性能警告:
     * - ?? 如果集合中數(shù)據(jù)量很大,此方法可能導(dǎo)致內(nèi)存溢出
     * - ?? 生產(chǎn)環(huán)境中謹(jǐn)慎使用,建議使用分頁查詢
     * 
     * 使用場景:
     * - 數(shù)據(jù)量小的配置表
     * - 數(shù)據(jù)導(dǎo)入導(dǎo)出操作
     * 
     * @param entityClass 實體類類型
     * @return 所有實體的列表
     */
    public List<T> findAll(Class<T> entityClass) {
        return mongoTemplate.findAll(entityClass);
    }
    
    /**
     * 根據(jù)條件查詢單個實體
     * 功能:根據(jù)自定義查詢條件返回第一個匹配的文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 執(zhí)行傳入的查詢條件
     * 2. 只返回第一個匹配的文檔
     * 3. 如果沒有匹配文檔,返回null
     * 
     * 使用場景:
     * - 根據(jù)唯一鍵查詢(如用戶名、手機(jī)號)
     * - 獲取最新的一條記錄(配合排序)
     * 
     * @param query 查詢條件對象(通過Criteria構(gòu)造)
     * @param entityClass 實體類類型
     * @return 查詢到的實體對象,不存在則返回null
     */
    public T findOne(Query query, Class<T> entityClass) {
        return mongoTemplate.findOne(query, entityClass);
    }
    
    /**
     * 根據(jù)條件查詢實體列表
     * 功能:根據(jù)自定義查詢條件返回所有匹配的文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 執(zhí)行傳入的查詢條件
     * 2. 返回所有匹配的文檔列表
     * 3. 如果沒有匹配文檔,返回空列表(不會返回null)
     * 
     * 使用場景:
     * - 條件查詢(如查詢某個狀態(tài)的所有用戶)
     * - 范圍查詢(如查詢某個時間段的所有訂單)
     * 
     * @param query 查詢條件對象(可以通過Criteria添加多個條件)
     * @param entityClass 實體類類型
     * @return 匹配的實體列表(可能為空列表)
     */
    public List<T> find(Query query, Class<T> entityClass) {
        return mongoTemplate.find(query, entityClass);
    }
    
    /**
     * 根據(jù)ID更新實體
     * 功能:根據(jù)文檔ID更新指定字段,只更新傳入的字段
     * 
     * 執(zhí)行邏輯:
     * 1. 構(gòu)造查詢條件:WHERE _id = ?
     * 2. 執(zhí)行更新操作,只修改Update對象中指定的字段
     * 3. 其他字段保持不變
     * 
     * 與save()的區(qū)別:
     * - save():會替換整個文檔(未傳入的字段會被清空)
     * - updateById():只更新指定字段(更安全,性能更好)
     * 
     * @param id 文檔ID(MongoDB的_id字段值)
     * @param update 更新操作對象(包含要更新的字段和新值)
     * @param entityClass 實體類類型
     * @return 更新結(jié)果對象,包含匹配數(shù)和修改數(shù)等信息
     */
    public UpdateResult updateById(Object id, Update update, Class<T> entityClass) {
        // 構(gòu)造查詢條件:ID等于傳入的id
        Query query = new Query(Criteria.where("_id").is(id));
        return mongoTemplate.updateFirst(query, update, entityClass);
    }
    
    /**
     * 根據(jù)條件更新第一個匹配的文檔
     * 功能:只更新查詢到的第一個文檔,即使有多個文檔匹配條件
     * 
     * 執(zhí)行邏輯:
     * 1. 根據(jù)query條件查找匹配的文檔
     * 2. 只更新第一個匹配的文檔
     * 3. 返回更新結(jié)果(包含影響的文檔數(shù))
     * 
     * 使用場景:
     * - 唯一鍵字段的更新
     * - 只需要更新一條記錄的情況
     * 
     * @param query 查詢條件對象(用于定位要更新的文檔)
     * @param update 更新操作對象(包含要更新的字段和新值)
     * @param entityClass 實體類類型
     * @return 更新結(jié)果對象,包含修改的文檔數(shù)等信息
     */
    public UpdateResult updateFirst(Query query, Update update, Class<T> entityClass) {
        return mongoTemplate.updateFirst(query, update, entityClass);
    }
    
    /**
     * 根據(jù)條件更新所有匹配的文檔
     * 功能:更新查詢條件匹配的所有文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 根據(jù)query條件查找所有匹配的文檔
     * 2. 更新所有匹配的文檔
     * 3. 返回更新結(jié)果(包含影響的文檔數(shù))
     * 
     * 性能注意事項:
     * - 如果匹配的文檔數(shù)量很多,此操作可能耗時較長
     * - 建議在查詢條件中添加索引以提高性能
     * 
     * 使用場景:
     * - 批量修改(如將所有狀態(tài)為0的用戶改為1)
     * - 數(shù)據(jù)修復(fù)和遷移
     * 
     * @param query 查詢條件對象(用于定位要更新的文檔)
     * @param update 更新操作對象(包含要更新的字段和新值)
     * @param entityClass 實體類類型
     * @return 更新結(jié)果對象,包含修改的文檔數(shù)等信息
     */
    public UpdateResult updateMulti(Query query, Update update, Class<T> entityClass) {
        return mongoTemplate.updateMulti(query, update, entityClass);
    }
    
    /**
     * 根據(jù)ID刪除實體
     * 功能:刪除指定ID的文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 構(gòu)造查詢條件:WHERE _id = ?
     * 2. 執(zhí)行刪除操作
     * 3. 返回刪除結(jié)果(包含刪除的文檔數(shù))
     * 
     * 使用場景:
     * - 根據(jù)主鍵刪除單個文檔
     * - 物理刪除數(shù)據(jù)
     * 
     * @param id 文檔ID(MongoDB的_id字段值)
     * @param entityClass 實體類類型
     * @return 刪除結(jié)果對象,包含刪除的文檔數(shù)
     */
    public DeleteResult deleteById(Object id, Class<T> entityClass) {
        Query query = new Query(Criteria.where("_id").is(id));
        return mongoTemplate.remove(query, entityClass);
    }
    
    /**
     * 根據(jù)條件刪除實體
     * 功能:刪除查詢條件匹配的所有文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 根據(jù)query條件查找所有匹配的文檔
     * 2. 刪除所有匹配的文檔
     * 3. 返回刪除結(jié)果(包含刪除的文檔數(shù))
     * 
     * ?? 安全警告:
     * - 如果query為空或條件太寬泛,會刪除大量數(shù)據(jù)
     * - 生產(chǎn)環(huán)境中務(wù)必仔細(xì)檢查查詢條件
     * 
     * @param query 查詢條件對象(用于定位要刪除的文檔)
     * @param entityClass 實體類類型
     * @return 刪除結(jié)果對象,包含刪除的文檔數(shù)
     */
    public DeleteResult delete(Query query, Class<T> entityClass) {
        return mongoTemplate.remove(query, entityClass);
    }
    
    /**
     * 刪除所有實體
     * 功能:清空整個集合中的所有文檔
     * 
     * ?? 危險操作:
     * - 此操作會刪除集合中的所有文檔
     * - 集合本身不會被刪除,但數(shù)據(jù)會全部清空
     * - 生產(chǎn)環(huán)境中謹(jǐn)慎使用,建議先備份數(shù)據(jù)
     * 
     * 使用場景:
     * - 測試數(shù)據(jù)清理
     * - 數(shù)據(jù)重置
     * 
     * @param entityClass 實體類類型
     * @return 刪除結(jié)果對象,包含刪除的文檔數(shù)
     */
    public DeleteResult deleteAll(Class<T> entityClass) {
        return mongoTemplate.remove(new Query(), entityClass);
    }
    
    /**
     * 檢查實體是否存在
     * 功能:檢查是否存在匹配查詢條件的文檔
     * 
     * 執(zhí)行邏輯:
     * 1. 根據(jù)query條件查詢
     * 2. 如果至少存在一個匹配文檔,返回true
     * 3. 如果沒有匹配文檔,返回false
     * 
     * 性能優(yōu)勢:
     * - 相比count(),此方法在找到第一個匹配文檔后立即返回
     * - 對于判斷存在性的場景,性能更好
     * 
     * 使用場景:
     * - 檢查用戶名是否已存在
     * - 檢查某個數(shù)據(jù)是否存在
     * 
     * @param query 查詢條件對象
     * @param entityClass 實體類類型
     * @return true表示存在,false表示不存在
     */
    public boolean exists(Query query, Class<T> entityClass) {
        return mongoTemplate.exists(query, entityClass);
    }
    
    /**
     * 統(tǒng)計文檔數(shù)量
     * 功能:統(tǒng)計匹配查詢條件的文檔總數(shù)
     * 
     * 執(zhí)行邏輯:
     * 1. 根據(jù)query條件查詢
     * 2. 統(tǒng)計所有匹配文檔的數(shù)量
     * 3. 返回總數(shù)(long類型)
     * 
     * 使用場景:
     * - 分頁查詢時先統(tǒng)計總數(shù)
     * - 數(shù)據(jù)統(tǒng)計報表
     * - 數(shù)據(jù)質(zhì)量檢查
     * 
     * 性能注意事項:
     * - 在大表上執(zhí)行count()可能較慢
     * - 建議為查詢條件添加索引
     * 
     * @param query 查詢條件對象
     * @param entityClass 實體類類型
     * @return 文檔數(shù)量
     */
    public long count(Query query, Class<T> entityClass) {
        return mongoTemplate.count(query, entityClass);
    }
    
    // ==================== 分頁查詢 ====================
    
    /**
     * 分頁查詢
     * 功能:支持排序和分頁的綜合查詢方法
     * 
     * 執(zhí)行邏輯:
     * 1. 如果指定了排序字段,添加排序條件
     * 2. 先統(tǒng)計符合條件的總記錄數(shù)
     * 3. 根據(jù)頁碼和每頁大小計算skip和limit
     * 4. 執(zhí)行分頁查詢
     * 5. 構(gòu)造Spring Data的Page對象返回
     * 
     * 返回的Page對象包含:
     * - content:當(dāng)前頁的數(shù)據(jù)列表
     * - totalElements:總記錄數(shù)
     * - totalPages:總頁數(shù)
     * - currentPage:當(dāng)前頁碼
     * - hasNext/hasPrevious:是否有下一頁/上一頁
     * 
     * 性能優(yōu)化建議:
     * - 為排序字段和查詢條件字段添加索引
     * - 避免使用過大的skip值(深度分頁)
     * 
     * @param query 查詢條件對象(可以為空,表示查詢所有)
     * @param pageRequest 分頁參數(shù)對象(包含頁碼、每頁大小、排序信息)
     * @param entityClass 實體類類型
     * @return Spring Data的Page對象,包含數(shù)據(jù)和分頁信息
     */
    public Page<T> findPage(Query query, PageRequest pageRequest, Class<T> entityClass) {
        // 如果指定了排序字段,則添加排序條件
        if (pageRequest.getSortField() != null) {
            // 判斷排序方向:desc表示降序,否則為升序
            Sort.Direction direction = "desc".equalsIgnoreCase(pageRequest.getSortOrder()) 
                ? Sort.Direction.DESC : Sort.Direction.ASC;
            // 將排序條件添加到查詢對象中
            query.with(Sort.by(direction, pageRequest.getSortField()));
        }
        
        // 先統(tǒng)計總數(shù),用于分頁信息
        long total = mongoTemplate.count(query, entityClass);
        
        // 設(shè)置分頁參數(shù):跳過前N條數(shù)據(jù),然后限制返回數(shù)量
        // skip: 跳過的記錄數(shù) = (頁碼-1) * 每頁大小
        // limit: 每頁返回的記錄數(shù)
        query.skip(pageRequest.getSkip()).limit(pageRequest.getPageSize());
        
        // 執(zhí)行分頁查詢
        List<T> list = mongoTemplate.find(query, entityClass);
        
        // 構(gòu)造Spring Data的Page對象返回
        return new PageImpl<>(list, 
            PageRequest.of(pageRequest.getPageNum() - 1, pageRequest.getPageSize()), 
            total);
    }
    
    // ==================== 高級查詢操作 ====================
    
    /**
     * 模糊查詢(不區(qū)分大小寫)
     * 功能:支持SQL LIKE '%keyword%'的模糊匹配,不區(qū)分大小寫
     * 
     * 實現(xiàn)原理:
     * 1. 使用正則表達(dá)式實現(xiàn)模糊匹配
     * 2. Pattern.CASE_INSENSITIVE標(biāo)志表示不區(qū)分大小寫
     * 3. MongoDB的$regex操作符支持正則表達(dá)式查詢
     * 
     * 性能注意事項:
     * - 模糊查詢無法使用普通索引,只能全表掃描
     * - 在數(shù)據(jù)量大的情況下性能較差
     * - 建議配合其他條件縮小查詢范圍
     * 
     * 使用場景:
     * - 搜索功能(如搜索用戶名、商品名)
     * - 數(shù)據(jù)模糊匹配
     * 
     * @param fieldName 字段名(要搜索的字段)
     * @param keyword 關(guān)鍵詞(搜索的關(guān)鍵詞)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria like(String fieldName, String keyword) {
        // 使用正則表達(dá)式實現(xiàn)模糊匹配,CASE_INSENSITIVE表示不區(qū)分大小寫
        Pattern pattern = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE);
        return Criteria.where(fieldName).regex(pattern);
    }
    
    /**
     * 多字段模糊查詢
     * 功能:在多個字段中搜索關(guān)鍵詞,任意一個字段匹配即滿足條件
     * 
     * 實現(xiàn)原理:
     * 1. 為每個字段構(gòu)造一個模糊查詢條件
     * 2. 使用OR操作符連接多個條件
     * 3. MongoDB的$or操作符實現(xiàn)OR邏輯
     * 
     * SQL等價:
     * WHERE field1 LIKE '%keyword%' OR field2 LIKE '%keyword%' OR ...
     * 
     * 使用場景:
     * - 全局搜索(同時搜索標(biāo)題、內(nèi)容、作者等)
     * - 多字段組合搜索
     * 
     * @param fields 字段名數(shù)組(要在哪些字段中搜索)
     * @param keyword 關(guān)鍵詞(搜索的關(guān)鍵詞)
     * @return 查詢條件對象(Criteria,使用OR連接)
     */
    public Criteria multiFieldLike(String[] fields, String keyword) {
        // 創(chuàng)建查詢條件數(shù)組,每個字段一個條件
        Criteria[] criteriaArray = new Criteria[fields.length];
        for (int i = 0; i < fields.length; i++) {
            criteriaArray[i] = like(fields[i], keyword);
        }
        // 使用orOperator將多個條件用OR連接
        return new Criteria().orOperator(criteriaArray);
    }
    
    /**
     * 范圍查詢
     * 功能:查詢字段值在指定范圍內(nèi)的文檔(包含邊界值)
     * 
     * 實現(xiàn)原理:
     * 1. gte: Greater Than or Equal(大于等于)
     * 2. lte: Less Than or Equal(小于等于)
     * 3. MongoDB的$gte和$lte操作符實現(xiàn)范圍查詢
     * 
     * SQL等價:
     * WHERE field >= min AND field <= max
     * 
     * 使用場景:
     * - 年齡范圍查詢(18-30歲)
     * - 價格范圍查詢(100-500元)
     * - 時間范圍查詢(某個時間段的數(shù)據(jù))
     * 
     * 性能優(yōu)化:
     * - 為范圍查詢字段添加索引可以顯著提高性能
     * - 復(fù)合索引:createIndex({field: 1})
     * 
     * @param fieldName 字段名(要進(jìn)行范圍查詢的字段)
     * @param min 最小值(包含)
     * @param max 最大值(包含)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria between(String fieldName, Object min, Object max) {
        // gte: 大于等于,lte: 小于等于
        return Criteria.where(fieldName).gte(min).lte(max);
    }
    
    /**
     * 大于查詢
     * 功能:查詢字段值大于指定值的文檔
     * 
     * SQL等價:WHERE field > value
     * 
     * @param fieldName 字段名
     * @param value 比較值
     * @return 查詢條件對象(Criteria)
     */
    public Criteria gt(String fieldName, Object value) {
        return Criteria.where(fieldName).gt(value);
    }
    
    /**
     * 小于查詢
     * 功能:查詢字段值小于指定值的文檔
     * 
     * SQL等價:WHERE field < value
     * 
     * @param fieldName 字段名
     * @param value 比較值
     * @return 查詢條件對象(Criteria)
     */
    public Criteria lt(String fieldName, Object value) {
        return Criteria.where(fieldName).lt(value);
    }
    
    /**
     * 大于等于查詢
     * 功能:查詢字段值大于等于指定值的文檔
     * 
     * SQL等價:WHERE field >= value
     * 
     * @param fieldName 字段名
     * @param value 比較值
     * @return 查詢條件對象(Criteria)
     */
    public Criteria gte(String fieldName, Object value) {
        return Criteria.where(fieldName).gte(value);
    }
    
    /**
     * 小于等于查詢
     * 功能:查詢字段值小于等于指定值的文檔
     * 
     * SQL等價:WHERE field <= value
     * 
     * @param fieldName 字段名
     * @param value 比較值
     * @return 查詢條件對象(Criteria)
     */
    public Criteria lte(String fieldName, Object value) {
        return Criteria.where(fieldName).lte(value);
    }
    
    /**
     * 不等于查詢
     * 功能:查詢字段值不等于指定值的文檔
     * 
     * SQL等價:WHERE field <> value 或 WHERE field != value
     * 
     * 使用場景:
     * - 排除某個值
     * - 查詢非空值
     * 
     * @param fieldName 字段名
     * @param value 比較值
     * @return 查詢條件對象(Criteria)
     */
    public Criteria ne(String fieldName, Object value) {
        return Criteria.where(fieldName).ne(value);
    }
    
    /**
     * IN查詢
     * 功能:查詢字段值在指定值列表中的文檔
     * 
     * SQL等價:
     * WHERE field IN (value1, value2, value3, ...)
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$in操作符匹配數(shù)組中的任意一個值
     * - 適用于多選條件查詢
     * 
     * 使用場景:
     * - 多狀態(tài)查詢(如查詢狀態(tài)為0或1的用戶)
     * - ID列表查詢(根據(jù)多個ID查詢對應(yīng)的文檔)
     * - 標(biāo)簽查詢(查詢包含某些標(biāo)簽的文檔)
     * 
     * 性能優(yōu)化:
     * - 為IN查詢字段添加索引可以顯著提高性能
     * - IN列表長度不宜過長(建議不超過100個)
     * 
     * @param fieldName 字段名
     * @param values 值列表(Collection類型,如List、Set等)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria in(String fieldName, Collection<?> values) {
        return Criteria.where(fieldName).in(values);
    }
    
    /**
     * NOT IN查詢
     * 功能:查詢字段值不在指定值列表中的文檔
     * 
     * SQL等價:
     * WHERE field NOT IN (value1, value2, value3, ...)
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$nin操作符匹配數(shù)組外的所有值
     * - 適用于排除多個值的場景
     * 
     * 使用場景:
     * - 排除多個狀態(tài)
     * - 排除某些特定值
     * 
     * 性能注意事項:
     * - NOT IN查詢的性能通常低于IN查詢
     * - 大列表的NOT IN查詢可能較慢
     * 
     * @param fieldName 字段名
     * @param values 值列表(Collection類型)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria notIn(String fieldName, Collection<?> values) {
        return Criteria.where(fieldName).nin(values);
    }
    
    /**
     * NULL查詢
     * 功能:查詢字段值為null的文檔
     * 
     * SQL等價:WHERE field IS NULL
     * 
     * 使用場景:
     * - 查找未填寫的字段
     * - 數(shù)據(jù)完整性檢查
     * 
     * @param fieldName 字段名
     * @return 查詢條件對象(Criteria)
     */
    public Criteria isNull(String fieldName) {
        return Criteria.where(fieldName).is(null);
    }
    
    /**
     * NOT NULL查詢
     * 功能:查詢字段值不為null的文檔
     * 
     * SQL等價:WHERE field IS NOT NULL
     * 
     * 使用場景:
     * - 查找已填寫的字段
     * - 過濾掉缺失的數(shù)據(jù)
     * 
     * @param fieldName 字段名
     * @return 查詢條件對象(Criteria)
     */
    public Criteria notNull(String fieldName) {
        return Criteria.where(fieldName).ne(null);
    }
    
    /**
     * 數(shù)組大小查詢
     * 功能:查詢數(shù)組字段長度等于指定值的文檔
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$size操作符用于查詢數(shù)組長度
     * - 只能匹配精確的數(shù)組長度,不能匹配范圍
     * 
     * 使用場景:
     * - 查詢標(biāo)簽數(shù)量(如查詢有3個標(biāo)簽的用戶)
     * - 查詢評論數(shù)量(如查詢有10條評論的文章)
     * 
     * 性能注意事項:
     * - $size操作符無法使用普通索引
     * - 如果數(shù)據(jù)量大,考慮添加專門的索引
     * 
     * @param fieldName 字段名(必須是數(shù)組類型的字段)
     * @param size 數(shù)組大?。ň_匹配)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria size(String fieldName, int size) {
        return Criteria.where(fieldName).size(size);
    }
    
    /**
     * 數(shù)組元素查詢
     * 功能:查詢數(shù)組字段中包含指定元素的文檔
     * 
     * 實現(xiàn)原理:
     * - 直接使用is()操作符查詢數(shù)組字段
     * - 如果數(shù)組中包含該元素,則匹配成功
     * 
     * 使用場景:
     * - 查詢包含某個標(biāo)簽的文檔
     * - 查詢包含某個值的數(shù)組
     * 
     * 示例:
     * - 查詢tags字段包含"java"的文檔:arrayContains("tags", "java")
     * 
     * @param fieldName 字段名(數(shù)組類型字段)
     * @param value 數(shù)組元素值(要在數(shù)組中查找的值)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria arrayContains(String fieldName, Object value) {
        return Criteria.where(fieldName).is(value);
    }
    
    /**
     * 地理位置查詢 - 圓形范圍
     * 功能:查詢指定經(jīng)緯度坐標(biāo)附近指定范圍內(nèi)的文檔
     * 
     * 實現(xiàn)原理:
     * 1. 創(chuàng)建GeoJsonPoint對象存儲經(jīng)緯度
     * 2. 使用$nearSphere操作符進(jìn)行球面距離查詢
     * 3. maxDistance參數(shù)需要轉(zhuǎn)換為弧度(除以地球半徑)
     * 
     * 坐標(biāo)說明:
     * - 經(jīng)度:東西方向,范圍-180到180
     * - 緯度:南北方向,范圍-90到90
     * - 中國大致范圍:經(jīng)度73-135,緯度18-53
     * 
     * 距離計算:
     * - nearSphere使用球面距離計算(考慮地球曲率)
     * - 地球半徑:6378137米(赤道半徑)
     * - 轉(zhuǎn)換公式:弧度 = 距離(米) / 地球半徑(米)
     * 
     * 使用場景:
     * - 附近的人/商家/酒店查詢
     * - 地理位置相關(guān)的推薦
     * - 距離排序
     * 
     * 性能優(yōu)化:
     * - 必須為地理位置字段創(chuàng)建2dsphere索引
     * - 建議同時創(chuàng)建復(fù)合索引提高查詢性能
     * 
     * 示例:
     * - 查詢天安門(116.397, 39.918)附近1000米內(nèi)的地點
     * 
     * @param fieldName 字段名(存儲地理坐標(biāo)的字段,類型通常為GeoJsonPoint)
     * @param longitude 經(jīng)度(東西方向,-180到180)
     * @param latitude 緯度(南北方向,-90到90)
     * @param maxDistance 最大距離(單位:米)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria nearSphere(String fieldName, double longitude, double latitude, double maxDistance) {
        // 創(chuàng)建地理坐標(biāo)點對象(經(jīng)度在前,緯度在后)
        Point point = new Point(longitude, latitude);
        
        // nearSphere使用球面距離計算,更精確(考慮地球曲率)
        // maxDistance需要除以地球半徑(6378137米)轉(zhuǎn)換為弧度
        // 因為MongoDB使用弧度作為距離單位
        return Criteria.where(fieldName).nearSphere(point).maxDistance(maxDistance / 6378137.0);
    }
    
    /**
     * 正則表達(dá)式查詢
     * 功能:支持使用正則表達(dá)式進(jìn)行靈活匹配
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$regex操作符支持PCRE正則表達(dá)式
     * - 支持復(fù)雜的字符串匹配模式
     * 
     * 常用正則表達(dá)式示例:
     * - ^abc: 以abc開頭
     * - abc$: 以abc結(jié)尾
     * - a.c: 中間是任意字符
     * - a*: 0個或多個a
     * - a+: 1個或多個a
     * - a?b: 可選的a后面跟著b
     * 
     * 使用場景:
     * - 復(fù)雜的字符串匹配
     * - 郵箱、手機(jī)號、身份證號驗證
     * - 特定格式的數(shù)據(jù)查詢
     * 
     * 性能注意事項:
     * - 正則查詢無法使用普通索引(除前綴匹配外)
     * - 復(fù)雜的正則表達(dá)式可能導(dǎo)致全表掃描
     * - 建議配合其他條件縮小查詢范圍
     * 
     * @param fieldName 字段名
     * @param pattern 正則表達(dá)式字符串(PCRE格式)
     * @return 查詢條件對象(Criteria)
     */
    public Criteria regex(String fieldName, String pattern) {
        return Criteria.where(fieldName).regex(pattern);
    }
    
    // ==================== 高級更新操作 ====================
    
    /**
     * 字段自增
     * 功能:將數(shù)值字段的值增加指定數(shù)量(支持正數(shù)和負(fù)數(shù))
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$inc操作符用于數(shù)值字段的原子自增/自減
     * - 原子操作:不需要先讀再寫,直接在數(shù)據(jù)庫端完成
     * 
     * 使用場景:
     * - 計數(shù)器(瀏覽量、點贊數(shù)、評論數(shù)等)
     * - 庫存扣減(減法操作)
     * - 積分增加(加法操作)
     * 
     * 優(yōu)勢:
     * - 原子操作,避免并發(fā)問題
     * - 性能優(yōu)于先讀后寫
     * - 支持小數(shù)運(yùn)算
     * 
     * 示例:
     * - increment("age", 1): 年齡加1
     * - increment("view_count", 100): 瀏覽量加100
     * - increment("stock", -5): 庫存減5
     * 
     * @param fieldName 字段名(必須是數(shù)值類型)
     * @param value 增量值(正數(shù)表示增加,負(fù)數(shù)表示減少)
     * @return 更新操作對象(Update)
     */
    public Update increment(String fieldName, Number value) {
        return new Update().inc(fieldName, value);
    }
    
    /**
     * 字段自乘
     * 功能:將數(shù)值字段的值乘以指定倍數(shù)
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$mul操作符用于數(shù)值字段的乘法運(yùn)算
     * - 原子操作,避免并發(fā)問題
     * 
     * 使用場景:
     * - 價格調(diào)整(打折扣)
     * - 權(quán)重計算
     * - 比例調(diào)整
     * 
     * 示例:
     * - multiply("price", 0.9): 價格打9折
     * - multiply("quantity", 2): 數(shù)量翻倍
     * 
     * @param fieldName 字段名(必須是數(shù)值類型)
     * @param value 乘數(shù)(乘數(shù))
     * @return 更新操作對象(Update)
     */
    public Update multiply(String fieldName, Number value) {
        return new Update().mul(fieldName, value);
    }
    
    /**
     * 數(shù)組添加元素
     * 功能:向數(shù)組字段添加一個元素(如果數(shù)組不存在則創(chuàng)建)
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$push操作符用于向數(shù)組添加元素
     * - 如果字段不存在,會自動創(chuàng)建并添加元素
     * - 如果字段存在但不是數(shù)組,會報錯
     * 
     * 使用場景:
     * - 添加標(biāo)簽
     * - 添加評論
     * - 添加收藏項
     * 
     * 示例:
     * - push("tags", "java"): 向tags數(shù)組添加"java"
     * 
     * 注意事項:
     * - 此方法會在數(shù)組末尾添加元素
     * - 如果要添加多個元素,使用pushAll()
     * - 如果要避免重復(fù)元素,使用$addToSet(Spring Data MongoDB默認(rèn))
     * 
     * @param fieldName 字段名(數(shù)組類型字段)
     * @param value 要添加的元素值
     * @return 更新操作對象(Update)
     */
    public Update push(String fieldName, Object value) {
        return new Update().push(fieldName, value);
    }
    
    /**
     * 數(shù)組批量添加元素
     * 功能:向數(shù)組字段一次性添加多個元素
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$pushAll操作符用于批量添加數(shù)組元素
     * - 一次操作添加多個元素,提高性能
     * 
     * 使用場景:
     * - 批量添加標(biāo)簽
     * - 批量添加列表項
     * 
     * 性能優(yōu)勢:
     * - 相比循環(huán)調(diào)用push(),此方法性能更好
     * - 減少網(wǎng)絡(luò)往返次數(shù)
     * 
     * @param fieldName 字段名(數(shù)組類型字段)
     * @param values 要添加的元素數(shù)組
     * @return 更新操作對象(Update)
     */
    public Update pushAll(String fieldName, Object[] values) {
        return new Update().pushAll(fieldName, values);
    }
    
    /**
     * 數(shù)組刪除元素
     * 功能:從數(shù)組字段中刪除指定值的所有匹配項
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$pull操作符用于刪除數(shù)組中匹配的元素
     * - 如果有多個相同的值,都會被刪除
     * - 如果值不存在,不會報錯
     * 
     * 使用場景:
     * - 刪除標(biāo)簽
     * - 刪除評論
     * - 刪除列表項
     * 
     * 示例:
     * - pull("tags", "java"): 從tags數(shù)組刪除所有"java"
     * 
     * @param fieldName 字段名(數(shù)組類型字段)
     * @param value 要刪除的元素值
     * @return 更新操作對象(Update)
     */
    public Update pull(String fieldName, Object value) {
        return new Update().pull(fieldName, value);
    }
    
    /**
     * 數(shù)組刪除多個元素
     * 功能:從數(shù)組字段中批量刪除指定的多個元素
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$pullAll操作符用于批量刪除數(shù)組元素
     * - 一次操作刪除多個元素,提高性能
     * 
     * 使用場景:
     * - 批量刪除標(biāo)簽
     * - 批量刪除列表項
     * 
     * @param fieldName 字段名(數(shù)組類型字段)
     * @param values 要刪除的元素數(shù)組
     * @return 更新操作對象(Update)
     */
    public Update pullAll(String fieldName, Object[] values) {
        return new Update().pullAll(fieldName, values);
    }
    
    /**
     * 修改數(shù)組中指定位置的元素
     * 功能:使用位置運(yùn)算符更新數(shù)組中特定位置的元素
     * 
     * 實現(xiàn)原理:
     * - 使用$set操作符更新指定位置的數(shù)組元素
     * - 需要配合查詢條件確定數(shù)組索引
     * 
     * 使用方式:
     * 1. 使用字段名加索引的方式指定位置,如"tags.0"表示第一個元素
     * 2. 可以配合查詢條件使用,如"tags.$.value"(使用$表示匹配的元素)
     * 
     * 使用場景:
     * - 修改數(shù)組中特定位置的元素
     * - 配合$elemMatch使用
     * 
     * 示例:
     * - setAtIndex("tags.0", "python"): 修改tags數(shù)組的第一個元素為"python"
     * 
     * 注意事項:
     * - 直接指定索引時,需要確保索引在數(shù)組范圍內(nèi)
     * - 建議配合查詢條件使用更安全
     * 
     * @param fieldName 字段名(包含位置表達(dá)式,如"tags.0"或使用$運(yùn)算符)
     * @param value 新的元素值
     * @return 更新操作對象(Update)
     */
    public Update setAtIndex(String fieldName, Object value) {
        return new Update().set(fieldName, value);
    }
    
    /**
     * 如果字段不存在則設(shè)置
     * 功能:僅在插入新文檔時設(shè)置字段值,更新時不會覆蓋已存在的字段
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$setOnInsert操作符
     * - 只在文檔不存在(即插入新文檔)時設(shè)置字段
     * - 如果文檔已存在(即更新操作),此字段不會被修改
     * 
     * 使用場景:
     * - 設(shè)置創(chuàng)建時間(只在創(chuàng)建時設(shè)置,更新時不修改)
     * - 設(shè)置默認(rèn)值(只在首次創(chuàng)建時設(shè)置)
     * - 設(shè)置初始化標(biāo)志
     * 
     * 示例:
     * - setOnInsert("create_time", new Date()): 只在插入時設(shè)置創(chuàng)建時間
     * - setOnInsert("version", 1): 只在插入時設(shè)置初始版本號
     * 
     * 注意事項:
     * - 通常與upsert操作配合使用
     * - 如果不使用upsert,此操作無意義
     * 
     * @param fieldName 字段名
     * @param value 字段值
     * @return 更新操作對象(Update)
     */
    public Update setOnInsert(String fieldName, Object value) {
        return new Update().setOnInsert(fieldName, value);
    }
    
    /**
     * 重命名字段
     * 功能:將文檔中的字段重命名
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$rename操作符
     * - 原子操作,不需要先讀后寫
     * 
     * 使用場景:
     * - 字段名優(yōu)化(如將old_name改為newName)
     * - 數(shù)據(jù)結(jié)構(gòu)遷移
     * - 字段名規(guī)范化
     * 
     * 示例:
     * - rename("username", "user_name"): 將username字段重命名為user_name
     * 
     * 注意事項:
     * - 如果新字段名已存在,會被覆蓋
     * - 如果舊字段名不存在,不會有任何效果
     * - 此操作在大型集合上可能較慢
     * 
     * @param oldName 舊字段名
     * @param newName 新字段名
     * @return 更新操作對象(Update)
     */
    public Update rename(String oldName, String newName) {
        return new Update().rename(oldName, newName);
    }
    
    /**
     * 刪除字段
     * 功能:從文檔中刪除指定字段
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$unset操作符
     * - 原子操作,不需要先讀后寫
     * 
     * 使用場景:
     * - 數(shù)據(jù)清理(刪除不需要的字段)
     * - 敏感信息刪除
     * - 數(shù)據(jù)結(jié)構(gòu)優(yōu)化
     * 
     * 示例:
     * - unset("password"): 刪除password字段
     * - unset("temporary_field"): 刪除臨時字段
     * 
     * 注意事項:
     * - 如果字段不存在,不會有任何效果(不會報錯)
     * - 刪除操作是永久的,無法恢復(fù)
     * 
     * @param fieldName 字段名
     * @return 更新操作對象(Update)
     */
    public Update unset(String fieldName) {
        return new Update().unset(fieldName);
    }
    
    /**
     * 當(dāng)前時間更新
     * 功能:將指定字段更新為當(dāng)前日期時間
     * 
     * 實現(xiàn)原理:
     * - MongoDB的$currentDate操作符
     * - 使用服務(wù)器當(dāng)前時間
     * - 原子操作,不需要先讀后寫
     * 
     * 使用場景:
     * - 更新時間戳(最后修改時間)
     * - 記錄更新時間
     * - 審計日志
     * 
     * 示例:
     * - currentDate("update_time"): 將update_time字段更新為當(dāng)前時間
     * - currentDate("last_modified"): 將last_modified字段更新為當(dāng)前時間
     * 
     * 優(yōu)勢:
     * - 不需要在Java代碼中獲取時間
     * - 避免客戶端和服務(wù)器時間不一致的問題
     * - 性能優(yōu)于先讀后寫
     * 
     * @param fieldName 字段名(通常是日期或時間戳類型)
     * @return 更新操作對象(Update)
     */
    public Update currentDate(String fieldName) {
        return new Update().currentDate(fieldName);
    }
    
    // ==================== 聚合操作 ====================
    
    /**
     * 執(zhí)行聚合查詢
     * 功能:執(zhí)行自定義的聚合管道,支持復(fù)雜的數(shù)據(jù)處理和統(tǒng)計
     * 
     * 聚合管道概念:
     * - 聚合管道是MongoDB強(qiáng)大的數(shù)據(jù)處理功能
     * - 通過多個階段(stage)依次處理數(shù)據(jù)
     * - 每個階段接收上階段的輸出作為輸入
     * 
     * 常用聚合階段:
     * - $match: 過濾文檔(類似WHERE)
     * - $group: 分組統(tǒng)計(類似GROUP BY)
     * - $sort: 排序(類似ORDER BY)
     * - $project: 投影(選擇字段)
     * - $limit: 限制返回數(shù)量
     * - $skip: 跳過指定數(shù)量
     * - $lookup: 關(guān)聯(lián)查詢(類似JOIN)
     * - $unwind: 拆分?jǐn)?shù)組
     * 
     * 使用場景:
     * - 復(fù)雜的數(shù)據(jù)統(tǒng)計
     * - 數(shù)據(jù)報表生成
     * - 數(shù)據(jù)分析
     * - 數(shù)據(jù)關(guān)聯(lián)查詢
     * 
     * 性能優(yōu)化:
     * - 盡早使用$match過濾數(shù)據(jù)
     * - 為查詢字段添加索引
     * - 合理使用投影減少數(shù)據(jù)傳輸量
     * 
     * @param aggregation 聚合操作對象(包含多個聚合階段)
     * @param entityClass 實體類類型(輸入類型)
     * @return 聚合結(jié)果對象(包含映射結(jié)果)
     */
    public AggregationResults<T> aggregate(Aggregation aggregation, Class<T> entityClass) {
        return mongoTemplate.aggregate(aggregation, entityClass, entityClass);
    }
    
    /**
     * 分組計數(shù)
     * 功能:按指定字段分組,統(tǒng)計每組的文檔數(shù)量
     * 
     * SQL等價:
     * SELECT field, COUNT(*) as count FROM table GROUP BY field ORDER BY count DESC
     * 
     * 聚合管道:
     * 1. $group: 按指定字段分組,使用count()統(tǒng)計數(shù)量
     * 2. $sort: 按計數(shù)降序排序
     * 
     * 使用場景:
     * - 統(tǒng)計各分類下的文章數(shù)量
     * - 統(tǒng)計各狀態(tài)的用戶數(shù)量
     * - 統(tǒng)計各個地區(qū)的訂單數(shù)量
     * 
     * 返回結(jié)果:
     * - List<Map>,每個Map包含:
     *   - _id: 分組字段的值
     *   - count: 文檔數(shù)量
     * 
     * @param groupByField 分組字段名(要按哪個字段分組)
     * @param entityClass 實體類類型
     * @return 分組統(tǒng)計結(jié)果列表(每項包含字段值和計數(shù))
     */
    public List<Map> groupCount(String groupByField, Class<T> entityClass) {
        // 構(gòu)建聚合管道:
        // 1. $group: 按指定字段分組,并統(tǒng)計每組的文檔數(shù)
        // 2. $sort: 按計數(shù)降序排序
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group(groupByField).count().as("count"),
            Aggregation.sort(Sort.Direction.DESC, "count")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults();
    }
    
    /**
     * 分組求和
     * 功能:按指定字段分組,計算每組的數(shù)值字段總和
     * 
     * SQL等價:
     * SELECT field, SUM(num_field) as total FROM table GROUP BY field ORDER BY total DESC
     * 
     * 聚合管道:
     * 1. $group: 按指定字段分組,使用sum()求和
     * 2. $sort: 按總和降序排序
     * 
     * 使用場景:
     * - 統(tǒng)計各分類的總銷售額
     * - 統(tǒng)計各部門的總支出
     * - 統(tǒng)計各用戶的總消費
     * 
     * 返回結(jié)果:
     * - List<Map>,每個Map包含:
     *   - _id: 分組字段的值
     *   - total: 總和
     * 
     * @param groupByField 分組字段名
     * @param sumField 要求和的數(shù)值字段名
     * @param entityClass 實體類類型
     * @return 分組求和結(jié)果列表
     */
    public List<Map> groupSum(String groupByField, String sumField, Class<T> entityClass) {
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group(groupByField).sum(sumField).as("total"),
            Aggregation.sort(Sort.Direction.DESC, "total")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults();
    }
    
    /**
     * 分組求平均值
     * 功能:按指定字段分組,計算每組的數(shù)值字段平均值
     * 
     * SQL等價:
     * SELECT field, AVG(num_field) as average FROM table GROUP BY field ORDER BY average DESC
     * 
     * 聚合管道:
     * 1. $group: 按指定字段分組,使用avg()求平均
     * 2. $sort: 按平均值降序排序
     * 
     * 使用場景:
     * - 統(tǒng)計各分類的平均價格
     * - 統(tǒng)計各班級的平均分
     * - 統(tǒng)計各員工的平均績效
     * 
     * 返回結(jié)果:
     * - List<Map>,每個Map包含:
     *   - _id: 分組字段的值
     *   - average: 平均值
     * 
     * @param groupByField 分組字段名
     * @param avgField 要求平均的數(shù)值字段名
     * @param entityClass 實體類類型
     * @return 分組求平均結(jié)果列表
     */
    public List<Map> groupAvg(String groupByField, String avgField, Class<T> entityClass) {
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group(groupByField).avg(avgField).as("average"),
            Aggregation.sort(Sort.Direction.DESC, "average")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults();
    }
    
    /**
     * 聚合分頁查詢
     * 功能:對聚合查詢結(jié)果進(jìn)行分頁,支持統(tǒng)計總數(shù)和返回分頁數(shù)據(jù)
     * 
     * 實現(xiàn)難點:
     * - 聚合查詢的分頁需要執(zhí)行兩次聚合
     * - 第一次:統(tǒng)計總數(shù)(使用$count)
     * - 第二次:分頁查詢(使用$skip和$limit)
     * 
     * 執(zhí)行邏輯:
     * 1. 如果指定了排序,添加排序階段
     * 2. 第一次聚合:統(tǒng)計總數(shù)
     * 3. 第二次聚合:執(zhí)行分頁查詢
     * 4. 構(gòu)造Page對象返回
     * 
     * 性能優(yōu)化:
     * - 兩次聚合可能影響性能
     * - 考慮使用緩存優(yōu)化
     * - 對于大數(shù)據(jù)集,考慮使用游標(biāo)分頁
     * 
     * @param aggregation 聚合操作對象
     * @param pageRequest 分頁參數(shù)對象
     * @param entityClass 實體類類型
     * @return 分頁結(jié)果對象(Page接口)
     */
    public Page<T> aggregatePage(Aggregation aggregation, PageRequest pageRequest, 
                                Class<T> entityClass) {
        // 如果指定了排序字段,添加排序條件
        if (pageRequest.getSortField() != null) {
            Sort.Direction direction = "desc".equalsIgnoreCase(pageRequest.getSortOrder()) 
                ? Sort.Direction.DESC : Sort.Direction.ASC;
            // 在原有聚合操作基礎(chǔ)上追加排序階段
            aggregation = Aggregation.newAggregation(
                aggregation.getOperations(),
                Aggregation.sort(Sort.by(direction, pageRequest.getSortField()))
            );
        }
        
        // 第一次聚合:統(tǒng)計總數(shù)
        // 在聚合管道末尾添加$count階段
        Aggregation countAggregation = Aggregation.newAggregation(
            aggregation.getOperations(),
            Aggregation.count().as("total")
        );
        AggregationResults<Map> countResults = mongoTemplate.aggregate(
            countAggregation, entityClass, Map.class);
        // 提取總數(shù),如果沒有結(jié)果則為0
        long total = countResults.getMappedResults().isEmpty() ? 0 : 
            (Long) countResults.getMappedResults().get(0).get("total");
        
        // 第二次聚合:執(zhí)行分頁查詢
        // 在聚合管道末尾添加$skip和$limit階段
        Aggregation pageAggregation = Aggregation.newAggregation(
            aggregation.getOperations(),
            Aggregation.skip(pageRequest.getSkip()),
            Aggregation.limit(pageRequest.getPageSize())
        );
        AggregationResults<T> results = mongoTemplate.aggregate(
            pageAggregation, entityClass, entityClass);
        
        // 構(gòu)造并返回Page對象
        return new PageImpl<>(results.getMappedResults(), 
            PageRequest.of(pageRequest.getPageNum() - 1, pageRequest.getPageSize()), 
            total);
    }
    
    /**
     * 查找最大值
     * 功能:查詢指定字段的最大值
     * 
     * SQL等價:SELECT MAX(field) as maxValue FROM table
     * 
     * 聚合管道:
     * - $group: 不分組(使用空的group()),使用max()求最大值
     * 
     * 使用場景:
     * - 查找最高價格
     * - 查找最大年齡
     * - 查找最新時間
     * 
     * @param fieldName 字段名(必須是數(shù)值或日期類型)
     * @param entityClass 實體類類型
     * @return 最大值對象(如果沒有數(shù)據(jù)則返回null)
     */
    public Object max(String fieldName, Class<T> entityClass) {
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group().max(fieldName).as("maxValue")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults().isEmpty() ? null : 
            results.getMappedResults().get(0).get("maxValue");
    }
    
    /**
     * 查找最小值
     * 功能:查詢指定字段的最小值
     * 
     * SQL等價:SELECT MIN(field) as minValue FROM table
     * 
     * 聚合管道:
     * - $group: 不分組(使用空的group()),使用min()求最小值
     * 
     * 使用場景:
     * - 查找最低價格
     * - 查找最小年齡
     * - 查找最早時間
     * 
     * @param fieldName 字段名(必須是數(shù)值或日期類型)
     * @param entityClass 實體類類型
     * @return 最小值對象(如果沒有數(shù)據(jù)則返回null)
     */
    public Object min(String fieldName, Class<T> entityClass) {
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group().min(fieldName).as("minValue")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults().isEmpty() ? null : 
            results.getMappedResults().get(0).get("minValue");
    }
    
    /**
     * 查找平均值
     * 功能:查詢指定字段的平均值
     * 
     * SQL等價:SELECT AVG(field) as avgValue FROM table
     * 
     * 聚合管道:
     * - $group: 不分組(使用空的group()),使用avg()求平均值
     * 
     * 使用場景:
     * - 計算平均價格
     * - 計算平均年齡
     * - 計算平均分
     * 
     * @param fieldName 字段名(必須是數(shù)值類型)
     * @param entityClass 實體類類型
     * @return 平均值(Double類型,如果沒有數(shù)據(jù)則返回null)
     */
    public Double avg(String fieldName, Class<T> entityClass) {
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group().avg(fieldName).as("avgValue")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults().isEmpty() ? null : 
            (Double) results.getMappedResults().get(0).get("avgValue");
    }
    
    /**
     * 求和
     * 功能:查詢指定字段的總和
     * 
     * SQL等價:SELECT SUM(field) as sumValue FROM table
     * 
     * 聚合管道:
     * - $group: 不分組(使用空的group()),使用sum()求和
     * 
     * 使用場景:
     * - 計算總銷售額
     * - 計算總數(shù)量
     * - 計算總積分
     * 
     * @param fieldName 字段名(必須是數(shù)值類型)
     * @param entityClass 實體類類型
     * @return 總和(Double類型,如果沒有數(shù)據(jù)則返回null)
     */
    public Double sum(String fieldName, Class<T> entityClass) {
        Aggregation aggregation = Aggregation.newAggregation(
            Aggregation.group().sum(fieldName).as("sumValue")
        );
        AggregationResults<Map> results = mongoTemplate.aggregate(
            aggregation, entityClass, Map.class);
        return results.getMappedResults().isEmpty() ? null : 
            ((Number) results.getMappedResults().get(0).get("sumValue")).doubleValue();
    }
    
    // ==================== 事務(wù)處理 ====================
    
    /**
     * 執(zhí)行事務(wù)操作(無返回值)
     * 功能:在事務(wù)中執(zhí)行操作,發(fā)生異常時自動回滾
     * 
     * MongoDB事務(wù)特性:
     * - 需要MongoDB 4.0+版本
     * - 需要副本集環(huán)境(Replica Set)
     * - 支持ACID特性(原子性、一致性、隔離性、持久性)
     * - 同一事務(wù)內(nèi)只能操作同一個數(shù)據(jù)庫
     * 
     * 使用場景:
     * - 轉(zhuǎn)賬操作(涉及兩個賬戶)
     * - 訂單處理(訂單、庫存、日志同時更新)
     * - 多步操作需要保證數(shù)據(jù)一致性
     * 
     * 性能注意事項:
     * - 事務(wù)操作會降低性能
     * - 事務(wù)執(zhí)行時間不宜過長(建議不超過60秒)
     * - 避免在事務(wù)中執(zhí)行大量查詢
     * 
     * 示例:
     * ```java
     * mongoUtils.executeInTransaction(() -> {
     *     // 扣減余額
     *     updateBalance(fromId, -100);
     *     // 增加余額
     *     updateBalance(toId, 100);
     * });
     * ```
     * 
     * @param action 要執(zhí)行的操作(Runnable接口,無返回值)
     * @return 操作是否成功(成功返回true,拋出異常返回false)
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean executeInTransaction(Runnable action) {
        try {
            // 執(zhí)行事務(wù)內(nèi)的操作
            action.run();
            // 如果沒有異常,返回true表示成功
            return true;
        } catch (Exception e) {
            // 記錄錯誤日志
            log.error("事務(wù)執(zhí)行失敗", e);
            // 重新拋出異常以觸發(fā)事務(wù)回滾
            throw e;
        }
    }
    
    /**
     * 執(zhí)行事務(wù)操作并返回結(jié)果
     * 功能:在事務(wù)中執(zhí)行有返回值的操作,發(fā)生異常時自動回滾
     * 
     * 與executeInTransaction()的區(qū)別:
     * - 此方法可以返回操作結(jié)果
     * - 使用Supplier接口(有返回值)
     * - 適用于需要獲取操作結(jié)果的場景
     * 
     * 使用場景:
     * - 創(chuàng)建對象并返回ID
     * - 執(zhí)行計算并返回結(jié)果
     * - 任何需要返回值的事務(wù)操作
     * 
     * 示例:
     * ```java
     * User user = mongoUtils.executeInTransactionWithResult(() -> {
     *     // 創(chuàng)建用戶
     *     return saveUser(user);
     *     // 創(chuàng)建關(guān)聯(lián)數(shù)據(jù)
     *     saveProfile(profile);
     * });
     * ```
     * 
     * @param action 要執(zhí)行的操作(Supplier接口,有返回值)
     * @param <R> 返回值類型
     * @return 操作結(jié)果
     * @throws RuntimeException 如果事務(wù)執(zhí)行失敗,拋出異常觸發(fā)回滾
     */
    @Transactional(rollbackFor = Exception.class)
    public <R> R executeInTransactionWithResult(java.util.function.Supplier<R> action) {
        try {
            // 執(zhí)行事務(wù)內(nèi)的操作并返回結(jié)果
            return action.get();
        } catch (Exception e) {
            // 記錄錯誤日志
            log.error("事務(wù)執(zhí)行失敗", e);
            // 重新拋出異常以觸發(fā)事務(wù)回滾
            throw e;
        }
    }
    
    // ==================== 索引操作 ====================
    
    /**
     * 創(chuàng)建索引
     * 功能:根據(jù)實體類上的@Indexed注解創(chuàng)建索引
     * 
     * 索引類型:
     * - 單字段索引:createIndex({field: 1})
     * - 復(fù)合索引:createIndex({field1: 1, field2: -1})
     * - 唯一索引:@Indexed(unique = true)
     * - 過期索引:@Indexed(expireAfterSeconds = 3600)
     * - 地理索引:@GeoSpatialIndexed
     * 
     * 性能影響:
     * - 索引會提高查詢性能
     * - 索引會降低插入、更新、刪除性能
     * - 索引占用磁盤空間
     * 
     * 最佳實踐:
     * - 為常用查詢字段創(chuàng)建索引
     * - 避免過度索引
     * - 定期分析慢查詢,優(yōu)化索引
     * 
     * @param entityClass 實體類類型(包含@Indexed注解)
     */
    public void createIndex(Class<T> entityClass) {
        mongoTemplate.indexOps(entityClass).ensureIndexes();
    }
    
    /**
     * 刪除索引
     * 功能:刪除集合的所有索引(保留_id索引)
     * 
     * 注意事項:
     * - _id索引無法被刪除(MongoDB默認(rèn)索引)
     * - 刪除索引后,相關(guān)查詢性能會下降
     * - 生產(chǎn)環(huán)境中謹(jǐn)慎使用
     * 
     * 使用場景:
     * - 重建索引(刪除后重新創(chuàng)建)
     * - 數(shù)據(jù)遷移
     * - 性能測試
     * 
     * @param entityClass 實體類類型
     */
    public void dropIndex(Class<T> entityClass) {
        mongoTemplate.indexOps(entityClass).dropAllIndexes();
    }
    
    /**
     * 獲取所有索引
     * 功能:查詢集合的所有索引信息
     * 
     * 返回信息:
     * - 索引名稱
     * - 索引字段
     * - 索引類型(單字段、復(fù)合、唯一等)
     * - 索引大小
     * 
     * 使用場景:
     * - 檢查索引創(chuàng)建情況
     * - 性能分析
     * - 索引優(yōu)化
     * 
     * @param entityClass 實體類類型
     * @return 索引信息列表(IndexInfo對象列表)
     */
    public List<IndexInfo> getIndexes(Class<T> entityClass) {
        return mongoTemplate.indexOps(entityClass).getIndexInfo();
    }
    
    // ==================== 批量操作 ====================
    
    /**
     * 批量插入
     * 功能:批量插入多個文檔
     * 
     * 性能優(yōu)勢:
     * - 減少網(wǎng)絡(luò)往返次數(shù)
     * - MongoDB內(nèi)部優(yōu)化批量寫入
     * 
     * 使用場景:
     * - 數(shù)據(jù)初始化
     * - 數(shù)據(jù)導(dǎo)入
     * - 批量新增
     * 
     * @param entities 實體集合
     * @param entityClass 實體類類型
     * @return 插入的實體集合
     */
    public List<T> bulkInsert(Collection<T> entities, Class<T> entityClass) {
        return (List<T>) mongoTemplate.insertAll(entities);
    }
    
    /**
     * 批量更新
     * 功能:執(zhí)行多個更新操作,一次性提交,提高性能
     * 
     * 實現(xiàn)原理:
     * - 使用BulkOperations進(jìn)行批量操作
     * - UNORDERED模式:無序執(zhí)行,效率更高
     * - 一次性提交所有更新操作
     * 
     * 性能優(yōu)勢:
     * - 減少網(wǎng)絡(luò)往返次數(shù)
     * - MongoDB內(nèi)部優(yōu)化批量執(zhí)行
     * - 顯著提高大量更新的性能
     * 
     * 使用場景:
     * - 批量修改數(shù)據(jù)
     * - 數(shù)據(jù)修復(fù)
     * - 批量更新狀態(tài)
     * 
     * 示例:
     * ```java
     * List<BulkUpdateOperation> updates = new ArrayList<>();
     * updates.add(new BulkUpdateOperation(query1, update1));
     * updates.add(new BulkUpdateOperation(query2, update2));
     * BulkOperationsResult result = bulkUpdate(updates, User.class);
     * ```
     * 
     * @param updates 更新操作列表(每個元素包含查詢條件和更新內(nèi)容)
     * @param entityClass 實體類類型
     * @return 批量操作結(jié)果(包含插入、修改、刪除的文檔數(shù))
     */
    public BulkOperationsResult bulkUpdate(List<BulkUpdateOperation> updates, Class<T> entityClass) {
        // 創(chuàng)建批量操作對象,使用UNORDERED模式(無序執(zhí)行,效率更高)
        // UNORDERED: 并發(fā)執(zhí)行,速度快但錯誤處理復(fù)雜
        // ORDERED: 順序執(zhí)行,遇到錯誤停止,速度較慢
        BulkOperations bulkOps = mongoTemplate.bulkOps(
            BulkOperations.BulkMode.UNORDERED, entityClass);
        
        // 將每個更新操作添加到批量操作中
        for (BulkUpdateOperation update : updates) {
            bulkOps.updateOne(update.getQuery(), update.getUpdate());
        }
        
        // 執(zhí)行批量操作并獲取結(jié)果
        com.mongodb.client.result.BulkWriteResult result = bulkOps.execute();
        // 封裝并返回批量操作結(jié)果
        return new BulkOperationsResult(
            result.getInsertedCount(),
            result.getModifiedCount(),
            result.getDeletedCount()
        );
    }
    
    /**
     * 批量操作結(jié)果封裝類
     * 功能:封裝批量操作的執(zhí)行結(jié)果,方便調(diào)用方獲取操作統(tǒng)計信息
     * 
     * 包含信息:
     * - insertedCount: 插入的文檔數(shù)
     * - modifiedCount: 修改的文檔數(shù)
     * - deletedCount: 刪除的文檔數(shù)
     * 
     * 使用場景:
     * - 統(tǒng)計批量操作的影響范圍
     * - 日志記錄
     * - 操作驗證
     */
    @Data
    public static class BulkOperationsResult {
        // 插入的文檔數(shù)
        private long insertedCount;
        // 修改的文檔數(shù)
        private long modifiedCount;
        // 刪除的文檔數(shù)
        private long deletedCount;
        
        /**
         * 構(gòu)造函數(shù)
         * @param insertedCount 插入的文檔數(shù)
         * @param modifiedCount 修改的文檔數(shù)
         * @param deletedCount 刪除的文檔數(shù)
         */
        public BulkOperationsResult(long insertedCount, long modifiedCount, long deletedCount) {
            this.insertedCount = insertedCount;
            this.modifiedCount = modifiedCount;
            this.deletedCount = deletedCount;
        }
    }
    
    /**
     * 批量更新操作封裝類
     * 功能:封裝單個批量更新操作的查詢條件和更新內(nèi)容
     * 
     * 包含信息:
     * - query: 查詢條件(用于匹配要更新的文檔)
     * - update: 更新操作(包含要更新的字段和新值)
     * 
     * 使用場景:
     * - 構(gòu)造批量更新操作列表
     * - 傳遞給bulkUpdate()方法
     * 
     * 示例:
     * ```java
     * Query query = new Query(Criteria.where("status").is(0));
     * Update update = new Update().set("status", 1);
     * BulkUpdateOperation operation = new BulkUpdateOperation(query, update);
     * ```
     */
    @Data
    public static class BulkUpdateOperation {
        // 查詢條件(用于匹配要更新的文檔)
        private Query query;
        // 更新操作(包含要更新的字段和新值)
        private Update update;
        
        /**
         * 構(gòu)造函數(shù)
         * @param query 查詢條件
         * @param update 更新操作
         */
        public BulkUpdateOperation(Query query, Update update) {
            this.query = query;
            this.update = update;
        }
    }
}

基礎(chǔ)CRUD操作

實體類示例

package com.example.mongodb.entity;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 用戶實體類
 * 
 * 注解說明:
 * - @Document: 指定對應(yīng)的MongoDB集合名稱
 * - @Id: 指定主鍵字段
 * - @Indexed: 為字段創(chuàng)建索引
 * - @Field: 指定字段在MongoDB中的名稱
 */
@Data
@Document(collection = "user")
public class User implements Serializable {
    
    // 主鍵,MongoDB自動生成ObjectId
    @Id
    private String id;
    
    // 用戶名,創(chuàng)建唯一索引
    @Indexed(unique = true)
    @Field("username")
    private String username;
    
    // 密碼
    @Field("password")
    private String password;
    
    // 郵箱
    @Field("email")
    private String email;
    
    // 手機(jī)號
    @Field("phone")
    private String phone;
    
    // 年齡
    @Field("age")
    private Integer age;
    
    // 性別(0-未知,1-男,2-女)
    @Field("gender")
    private Integer gender;
    
    // 狀態(tài)(0-禁用,1-啟用)
    @Field("status")
    private Integer status;
    
    // 標(biāo)簽數(shù)組
    @Field("tags")
    private List<String> tags;
    
    // 創(chuàng)建時間
    @Field("create_time")
    private Date createTime;
    
    // 更新時間
    @Field("update_time")
    private Date updateTime;
}

Service層示例

package com.example.mongodb.service;

import com.example.mongodb.entity.User;
import com.example.mongodb.utils.MongoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 用戶服務(wù)類 - 演示如何使用MongoUtils工具類
 */
@Service
public class UserService {
    
    @Autowired
    private MongoUtils<User> mongoUtils;
    
    /**
     * 保存用戶
     * 功能:創(chuàng)建新用戶,設(shè)置創(chuàng)建時間和更新時間
     */
    public User saveUser(User user) {
        // 設(shè)置創(chuàng)建時間和更新時間
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        // 調(diào)用工具類保存
        return mongoUtils.save(user);
    }
    
    /**
     * 批量保存用戶
     * 功能:一次性保存多個用戶
     */
    public List<User> saveUsers(List<User> users) {
        // 為每個用戶設(shè)置時間
        Date now = new Date();
        users.forEach(user -> {
            user.setCreateTime(now);
            user.setUpdateTime(now);
        });
        // 批量保存
        return mongoUtils.saveBatch(users);
    }
    
    /**
     * 根據(jù)ID查詢用戶
     */
    public User getUserById(String id) {
        return mongoUtils.findById(id, User.class);
    }
    
    /**
     * 查詢所有用戶
     * 注意:如果數(shù)據(jù)量大,建議使用分頁查詢
     */
    public List<User> getAllUsers() {
        return mongoUtils.findAll(User.class);
    }
    
    /**
     * 根據(jù)用戶名查詢用戶
     * 功能:通過用戶名精確查詢
     */
    public User getUserByUsername(String username) {
        Query query = new Query(Criteria.where("username").is(username));
        return mongoUtils.findOne(query, User.class);
    }
    
    /**
     * 根據(jù)用戶名和密碼查詢用戶
     * 功能:用戶登錄驗證
     */
    public User getUserByUsernameAndPassword(String username, String password) {
        Query query = new Query(Criteria.where("username").is(username)
            .and("password").is(password));
        return mongoUtils.findOne(query, User.class);
    }
    
    /**
     * 根據(jù)ID更新用戶
     * 功能:只更新傳入的字段,其他字段保持不變
     */
    public long updateUser(String id, User user) {
        // 創(chuàng)建更新對象
        Update update = new Update();
        
        // 只更新非空字段
        if (user.getUsername() != null) {
            update.set("username", user.getUsername());
        }
        if (user.getPassword() != null) {
            update.set("password", user.getPassword());
        }
        if (user.getEmail() != null) {
            update.set("email", user.getEmail());
        }
        if (user.getPhone() != null) {
            update.set("phone", user.getPhone());
        }
        if (user.getAge() != null) {
            update.set("age", user.getAge());
        }
        if (user.getGender() != null) {
            update.set("gender", user.getGender());
        }
        if (user.getStatus() != null) {
            update.set("status", user.getStatus());
        }
        
        // 更新時間
        update.set("update_time", new Date());
        
        // 執(zhí)行更新并返回修改的文檔數(shù)
        return mongoUtils.updateById(id, update, User.class).getModifiedCount();
    }
    
    /**
     * 根據(jù)ID刪除用戶
     */
    public long deleteUser(String id) {
        return mongoUtils.deleteById(id, User.class).getDeletedCount();
    }
    
    /**
     * 檢查用戶名是否存在
     */
    public boolean existsUsername(String username) {
        Query query = new Query(Criteria.where("username").is(username));
        return mongoUtils.exists(query, User.class);
    }
    
    /**
     * 統(tǒng)計用戶數(shù)量
     */
    public long countUsers() {
        return mongoUtils.count(new Query(), User.class);
    }
}

高級查詢功能

復(fù)雜查詢示例

package com.example.mongodb.service;

import com.example.mongodb.common.PageRequest;
import com.example.mongodb.entity.User;
import com.example.mongodb.utils.MongoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 高級查詢服務(wù)類 - 演示各種高級查詢功能
 */
@Service
public class UserAdvancedQueryService {
    
    @Autowired
    private MongoUtils<User> mongoUtils;
    
    /**
     * 模糊查詢用戶
     * 功能:根據(jù)用戶名模糊查詢,不區(qū)分大小寫
     */
    public List<User> searchUsers(String keyword) {
        Query query = new Query(mongoUtils.like("username", keyword));
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * 多字段模糊查詢
     * 功能:同時在用戶名、郵箱、手機(jī)號中搜索關(guān)鍵詞
     */
    public List<User> multiFieldSearch(String keyword) {
        String[] fields = {"username", "email", "phone"};
        Query query = new Query(mongoUtils.multiFieldLike(fields, keyword));
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * 年齡范圍查詢
     * 功能:查詢年齡在指定范圍內(nèi)的用戶
     */
    public List<User> getUsersByAgeRange(Integer minAge, Integer maxAge) {
        Query query = new Query(mongoUtils.between("age", minAge, maxAge));
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * 狀態(tài)和年齡組合查詢
     * 功能:查詢指定狀態(tài)且年齡大于某個值的用戶
     */
    public List<User> getUsersByStatusAndAge(Integer status, Integer age) {
        Query query = new Query(
            Criteria.where("status").is(status)
            .and("age").gt(age)
        );
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * IN查詢
     * 功能:查詢狀態(tài)在指定列表中的用戶
     */
    public List<User> getUsersByStatusList(List<Integer> statusList) {
        Query query = new Query(mongoUtils.in("status", statusList));
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * 標(biāo)簽包含查詢
     * 功能:查詢包含指定標(biāo)簽的用戶
     */
    public List<User> getUsersByTag(String tag) {
        Query query = new Query(mongoUtils.arrayContains("tags", tag));
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * 復(fù)合條件查詢
     * 功能:使用AND連接多個條件
     */
    public List<User> getUsersByComplexCondition(String keyword, Integer minAge, List<Integer> statusList) {
        Query query = new Query(
            new Criteria().andOperator(
                mongoUtils.like("username", keyword),
                mongoUtils.gte("age", minAge),
                mongoUtils.in("status", statusList)
            )
        );
        return mongoUtils.find(query, User.class);
    }
    
    /**
     * 分頁查詢
     * 功能:查詢所有用戶并分頁
     */
    public Page<User> getUsersByPage(PageRequest pageRequest) {
        Query query = new Query();
        return mongoUtils.findPage(query, pageRequest, User.class);
    }
    
    /**
     * 條件分頁查詢
     * 功能:查詢指定狀態(tài)的用戶并分頁
     */
    public Page<User> getUsersByPageWithCondition(Integer status, PageRequest pageRequest) {
        Query query = new Query(Criteria.where("status").is(status));
        return mongoUtils.findPage(query, pageRequest, User.class);
    }
}

高級更新操作示例

package com.example.mongodb.service;

import com.example.mongodb.entity.User;
import com.example.mongodb.utils.MongoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 高級更新服務(wù)類 - 演示各種高級更新功能
 */
@Service
public class UserAdvancedUpdateService {
    
    @Autowired
    private MongoUtils<User> mongoUtils;
    
    /**
     * 用戶年齡自增
     * 功能:將指定用戶的年齡加1
     */
    public long incrementAge(String userId) {
        Query query = new Query(Criteria.where("_id").is(userId));
        Update update = mongoUtils.increment("age", 1);
        return mongoUtils.updateFirst(query, update, User.class).getModifiedCount();
    }
    
    /**
     * 批量添加標(biāo)簽
     * 功能:向用戶的標(biāo)簽數(shù)組添加多個標(biāo)簽
     */
    public long addTags(String userId, List<String> newTags) {
        Query query = new Query(Criteria.where("_id").is(userId));
        for (String tag : newTags) {
            Update update = mongoUtils.push("tags", tag);
            mongoUtils.updateFirst(query, update, User.class);
        }
        return newTags.size();
    }
    
    /**
     * 批量刪除標(biāo)簽
     * 功能:從用戶的標(biāo)簽數(shù)組刪除多個標(biāo)簽
     */
    public long removeTags(String userId, List<String> tagsToRemove) {
        Query query = new Query(Criteria.where("_id").is(userId));
        for (String tag : tagsToRemove) {
            Update update = mongoUtils.pull("tags", tag);
            mongoUtils.updateFirst(query, update, User.class);
        }
        return tagsToRemove.size();
    }
    
    /**
     * 批量添加標(biāo)簽(一次性)
     * 功能:使用pushAll一次性添加多個標(biāo)簽,性能更好
     */
    public long addTagsBatch(String userId, String[] newTags) {
        Query query = new Query(Criteria.where("_id").is(userId));
        Update update = mongoUtils.pushAll("tags", newTags);
        return mongoUtils.updateFirst(query, update, User.class).getModifiedCount();
    }
    
    /**
     * 更新用戶狀態(tài)(存在則更新,不存在則設(shè)置默認(rèn)值)
     * 功能:演示setOnInsert的使用
     */
    public long updateStatusWithDefault(String userId, Integer status) {
        Query query = new Query(Criteria.where("_id").is(userId));
        Update update = mongoUtils.setOnInsert("status", 1);
        update.set("status", status);
        return mongoUtils.updateFirst(query, update, User.class).getModifiedCount();
    }
    
    /**
     * 重命名字段
     * 功能:將字段名從oldName改為newName
     */
    public long renameField(String userId, String oldName, String newName) {
        Query query = new Query(Criteria.where("_id").is(userId));
        Update update = mongoUtils.rename(oldName, newName);
        return mongoUtils.updateFirst(query, update, User.class).getModifiedCount();
    }
    
    /**
     * 刪除字段
     * 功能:從文檔中刪除指定字段
     */
    public long removeField(String userId, String fieldName) {
        Query query = new Query(Criteria.where("_id").is(userId));
        Update update = mongoUtils.unset(fieldName);
        return mongoUtils.updateFirst(query, update, User.class).getModifiedCount();
    }
    
    /**
     * 更新時間戳
     * 功能:將update_time字段更新為當(dāng)前時間
     */
    public long updateTimestamp(String userId) {
        Query query = new Query(Criteria.where("_id").is(userId));
        Update update = mongoUtils.currentDate("update_time");
        return mongoUtils.updateFirst(query, update, User.class).getModifiedCount();
    }
    
    /**
     * 批量更新操作
     * 功能:批量更新多個用戶的狀態(tài)
     */
    public long bulkUpdateUsers(List<String> userIds, Integer newStatus) {
        List<MongoUtils.BulkUpdateOperation> updates = new java.util.ArrayList<>();
        
        for (String userId : userIds) {
            Query query = new Query(Criteria.where("_id").is(userId));
            Update update = new Update().set("status", newStatus);
            updates.add(new MongoUtils.BulkUpdateOperation(query, update));
        }
        
        MongoUtils.BulkOperationsResult result = mongoUtils.bulkUpdate(updates, User.class);
        return result.getModifiedCount();
    }
}

聚合操作示例

package com.example.mongodb.service;

import com.example.mongodb.entity.User;
import com.example.mongodb.utils.MongoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 聚合查詢服務(wù)類 - 演示各種聚合操作
 */
@Service
public class UserAggregationService {
    
    @Autowired
    private MongoUtils<User> mongoUtils;
    
    /**
     * 按性別分組統(tǒng)計用戶數(shù)量
     */
    public List<Map> groupCountByGender() {
        return mongoUtils.groupCount("gender", User.class);
    }
    
    /**
     * 按狀態(tài)分組統(tǒng)計用戶數(shù)量
     */
    public List<Map> groupCountByStatus() {
        return mongoUtils.groupCount("status", User.class);
    }
    
    /**
     * 按年齡段分組統(tǒng)計
     * 功能:自定義聚合管道,按10歲一個年齡段分組
     */
    public List<Map> groupCountByAgeRange() {
        Aggregation aggregation = Aggregation.newAggregation(
            // 使用表達(dá)式將年齡分段:0-9, 10-19, 20-29...
            Aggregation.project()
                .andExpression("floor(age / 10) * 10").as("ageRange"),
            // 按年齡段分組統(tǒng)計
            Aggregation.group("ageRange")
                .count().as("count"),
            // 按年齡段升序排序
            Aggregation.sort(org.springframework.data.domain.Sort.Direction.ASC, "_id")
        );
        
        AggregationResults<Map> results = mongoUtils.aggregate(aggregation, User.class, Map.class);
        return results.getMappedResults();
    }
    
    /**
     * 統(tǒng)計各狀態(tài)用戶的平均年齡
     */
    public List<Map> groupAvgAgeByStatus() {
        return mongoUtils.groupAvg("status", "age", User.class);
    }
    
    /**
     * 查找最大年齡
     */
    public Object getMaxAge() {
        return mongoUtils.max("age", User.class);
    }
    
    /**
     * 查找最小年齡
     */
    public Object getMinAge() {
        return mongoUtils.min("age", User.class);
    }
    
    /**
     * 計算平均年齡
     */
    public Double getAvgAge() {
        return mongoUtils.avg("age", User.class);
    }
    
    /**
     * 統(tǒng)計總年齡
     */
    public Double getSumAge() {
        return mongoUtils.sum("age", User.class);
    }
    
    /**
     * 復(fù)雜聚合查詢:按狀態(tài)分組,統(tǒng)計數(shù)量、平均年齡、最大年齡
     */
    public List<Map> complexGroupByStatus() {
        Aggregation aggregation = Aggregation.newAggregation(
            // 按狀態(tài)分組
            Aggregation.group("status")
                // 統(tǒng)計用戶數(shù)
                .count().as("userCount")
                // 統(tǒng)計平均年齡
                .avg("age").as("avgAge")
                // 統(tǒng)計最大年齡
                .max("age").as("maxAge")
                // 統(tǒng)計最小年齡
                .min("age").as("minAge"),
            // 按用戶數(shù)降序排序
            Aggregation.sort(org.springframework.data.domain.Sort.Direction.DESC, "userCount")
        );
        
        AggregationResults<Map> results = mongoUtils.aggregate(aggregation, User.class, Map.class);
        return results.getMappedResults();
    }
}

最佳實踐

1. 索引優(yōu)化

為常用查詢字段創(chuàng)建索引

@Indexed
private String username;

創(chuàng)建復(fù)合索引優(yōu)化多字段查詢

@CompoundIndex(name = "idx_status_create_time", def = "{'status': 1, 'createTime': -1}")

避免過度索引

  • 索引會提高查詢性能,但會降低寫入性能
  • 建議為高頻查詢字段創(chuàng)建索引
  • 定期分析慢查詢,優(yōu)化索引

2. 查詢優(yōu)化

只查詢需要的字段

Query query = new Query();
query.fields().include("username").include("email");

避免深度分頁

  • skip()在數(shù)據(jù)量大時性能較差
  • 考慮使用基于游標(biāo)的分頁

使用索引覆蓋查詢

// 查詢條件和排序都使用索引字段
query.addCriteria(Criteria.where("status").is(1));
query.with(Sort.by(Sort.Direction.DESC, "createTime"));

3. 批量操作

大量數(shù)據(jù)插入使用批量插入

mongoUtils.saveBatch(users);

多文檔更新使用BulkOperations

mongoUtils.bulkUpdate(updates, User.class);

總結(jié)

本文詳細(xì)介紹了SpringBoot整合MongoDB的完整工具類實現(xiàn),涵蓋了基礎(chǔ)CRUD、高級查詢、聚合操作、事務(wù)處理等功能。通過合理封裝MongoDB操作,可以顯著提高開發(fā)效率和代碼質(zhì)量。

以上就是SpringBoot整合MongoDB的完整操作指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot整合MongoDB的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談mybatis中SQL語句給boolean類型賦值問題

    淺談mybatis中SQL語句給boolean類型賦值問題

    這篇文章主要介紹了淺談mybatis中SQL語句給boolean類型賦值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Spring RestTemplate的使用與踩坑

    Spring RestTemplate的使用與踩坑

    RestTemplate是一個執(zhí)行HTTP請求的同步阻塞式工具類,它僅僅只是在HTTP客戶端庫基礎(chǔ)上,封裝了更加簡單易用的模板方法API,方便程序員利用已提供的模板方法發(fā)起網(wǎng)絡(luò)請求和處理,能很大程度上提升我們的開發(fā)效率
    2023-02-02
  • springboot log4j2不能打印框架錯誤日志的解決方案

    springboot log4j2不能打印框架錯誤日志的解決方案

    這篇文章主要介紹了springboot log4j2不能打印框架錯誤日志的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Eclipse/MyEclipse轉(zhuǎn)IntelliJ IDEA完全攻略(圖文)

    Eclipse/MyEclipse轉(zhuǎn)IntelliJ IDEA完全攻略(圖文)

    這篇文章主要介紹了Eclipse/MyEclipse轉(zhuǎn)IntelliJ IDEA完全攻略(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java MySQL動態(tài)語句編寫實現(xiàn)方式

    Java MySQL動態(tài)語句編寫實現(xiàn)方式

    這篇文章主要介紹了Java MySQL動態(tài)語句編寫實現(xiàn)方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • javacv開發(fā)詳解之調(diào)用本機(jī)攝像頭視頻

    javacv開發(fā)詳解之調(diào)用本機(jī)攝像頭視頻

    這篇文章主要介紹了javacv開發(fā)詳解之調(diào)用本機(jī)攝像頭視頻,對javacv感興趣的同學(xué),可以參考下
    2021-04-04
  • Spring Bean作用域詳解之從單例到自定義作用域的全面指南

    Spring Bean作用域詳解之從單例到自定義作用域的全面指南

    本文詳細(xì)介紹了Spring框架中的六種標(biāo)準(zhǔn)Bean作用域,包括singleton、prototype、request、session、application和websocket,并探討了如何根據(jù)業(yè)務(wù)需求選擇合適的Bean生命周期管理策略,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • SpringBoot整合ELK做日志超完整詳細(xì)教程

    SpringBoot整合ELK做日志超完整詳細(xì)教程

    本文詳細(xì)介紹了如何在springboot中快速接入ELK的過程,ELK可以說在實際項目中具有很好的適用價值,不管是小項目,還是中大型項目,都具備普適參考性,值得深入了解和學(xué)習(xí),感興趣的朋友一起看看吧
    2024-01-01
  • 一篇文章帶你入門Java封裝

    一篇文章帶你入門Java封裝

    Java面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。下面對三大特性之一封裝進(jìn)行了總結(jié),需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • Spring AOP有多少個通知以及它們的執(zhí)行順序介紹

    Spring AOP有多少個通知以及它們的執(zhí)行順序介紹

    這篇文章主要介紹了Spring AOP有多少個通知以及它們的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

美女福利视频导航网站 | 午夜在线观看岛国av,com| 中文字幕网站你懂的| 香蕉aⅴ一区二区三区| 亚洲精品ww久久久久久| 中文字幕人妻av在线观看| 久久久精品欧洲亚洲av| 日本高清成人一区二区三区| 日本精品视频不卡一二三| 亚洲日本一区二区三区| 日本少妇精品免费视频| 亚洲专区激情在线观看视频| 在线亚洲天堂色播av电影| 亚洲中文字幕综合小综合| 最新91精品视频在线| 日本午夜爽爽爽爽爽视频在线观看| 水蜜桃一区二区三区在线观看视频 | 中文字幕在线第一页成人| 性感美女诱惑福利视频| 日本少妇在线视频大香蕉在线观看| 久碰精品少妇中文字幕av| 极品性荡少妇一区二区色欲| 熟女人妻一区二区精品视频| 日韩三级电影华丽的外出| 日韩精品中文字幕福利| 天天摸天天干天天操科普| 久久久精品精品视频视频| 97资源人妻免费在线视频| 中文字幕亚洲中文字幕| 欧美一级视频一区二区| 精品成人午夜免费看| 天天日天天干天天舔天天射| 99精品一区二区三区的区| 日本韩国在线观看一区二区| 日本丰满熟妇BBXBBXHD| 精品人妻伦一二三区久 | 欧洲日韩亚洲一区二区三区 | 亚洲一区二区三区久久受| 91免费福利网91麻豆国产精品| 天天日天天日天天擦| 亚洲 欧美 精品 激情 偷拍| 夜鲁夜鲁狠鲁天天在线| 91传媒一区二区三区| 最新的中文字幕 亚洲| 天天日天天透天天操| 国产精品自偷自拍啪啪啪| 亚洲av第国产精品| 欧美天堂av无线av欧美| 日韩亚国产欧美三级涩爱| 一区二区三区视频,福利一区二区 丰满的子国产在线观看 | 2020国产在线不卡视频 | 亚洲国产在线精品国偷产拍| 在线观看av亚洲情色| 亚洲2021av天堂| 日本成人一区二区不卡免费在线| 99热国产精品666| 国产一区av澳门在线观看| 亚洲欧美自拍另类图片| 欧美精品亚洲精品日韩在线| 97小视频人妻一区二区| 天天日天天添天天爽| 一区二区三区四区视频在线播放| 2012中文字幕在线高清| 激情五月婷婷免费视频| 精品av国产一区二区三区四区| 人妻凌辱欧美丰满熟妇| 丰满的继坶3中文在线观看| 天天射夜夜操狠狠干| 亚洲 清纯 国产com| 国产1区,2区,3区| 国产日韩一区二区在线看| 日本黄在免费看视频| 一区二区三区日韩久久| 亚洲国产精品久久久久蜜桃| 快插进小逼里大鸡吧视频| 福利视频广场一区二区| 久久久久久97三级| 福利片区一区二体验区| 91中文字幕最新合集| 91欧美在线免费观看| 久久久极品久久蜜桃| 粉嫩欧美美人妻小视频| 亚洲特黄aaaa片| 精品黑人一区二区三区久久国产 | 激情伦理欧美日韩中文字幕| 国产美女午夜福利久久| 国产丰满熟女成人视频| 大香蕉日本伊人中文在线| 在线观看操大逼视频| 人妻久久无码中文成人| 99热国产精品666| av一本二本在线观看| 免费在线看的黄网站| caoporn蜜桃视频| 人妻av无码专区久久绿巨人| 含骚鸡巴玩逼逼视频| 日韩少妇人妻精品无码专区 | 五十路丰满人妻熟妇| 51精品视频免费在线观看| 在线国产精品一区二区三区| 最新国产精品网址在线观看| 日日操综合成人av| 欧美精品 日韩国产| 亚洲 国产 成人 在线| 亚洲人妻视频在线网| 秋霞午夜av福利经典影视| 91免费观看国产免费| 姐姐的朋友2在线观看中文字幕| 在线观看的黄色免费网站| 无码中文字幕波多野不卡| 亚洲粉嫩av一区二区三区| 亚洲av成人网在线观看| 欧美女同性恋免费a| 日本熟女精品一区二区三区| 日本免费一级黄色录像| 美女日逼视频免费观看| 日本午夜爽爽爽爽爽视频在线观看 | 中文字幕第1页av一天堂网| 久久久久久性虐视频| 97人妻总资源视频| 老师让我插进去69AV| 2022精品久久久久久中文字幕| 阴茎插到阴道里面的视频| 色呦呦视频在线观看视频| 亚洲熟妇久久无码精品| 一色桃子人妻一区二区三区| 日本性感美女三级视频| 亚洲国产在人线放午夜| 午夜精品一区二区三区更新| 人妻少妇亚洲精品中文字幕| 国产精品福利小视频a| 11久久久久久久久久久| 精彩视频99免费在线| 日本免费午夜视频网站| 亚洲国产在线精品国偷产拍| 免费十精品十国产网站| 天天操夜夜骑日日摸| 免费国产性生活视频| 人妻少妇中文有码精品| 日韩成人综艺在线播放| 国产va精品免费观看| 熟女在线视频一区二区三区| 亚洲精品乱码久久久久久密桃明| 国产一区二区视频观看| 日本一区美女福利视频| 狠狠操狠狠操免费视频| 在线免费91激情四射| 99热碰碰热精品a中文| 国产伊人免费在线播放| 阴茎插到阴道里面的视频| 97超碰国语国产97超碰| 国产一区二区神马久久| 中文字幕日韩无敌亚洲精品| 2012中文字幕在线高清| 99久久99一区二区三区| 在线观看的黄色免费网站| 天天综合天天综合天天网 | 日韩精品二区一区久久| 亚洲高清国产一区二区三区| 一二三区在线观看视频| 亚洲人妻视频在线网| 亚洲自拍偷拍综合色| 亚洲在线一区二区欧美| 中文字幕日韩精品日本| 日本一二三区不卡无| 日韩特级黄片高清在线看| 久久久久久久久久性潮| 五月天色婷婷在线观看视频免费| 国产一线二线三线的区别在哪| 日本av在线一区二区三区| 一区国内二区日韩三区欧美| 日本丰满熟妇BBXBBXHD| 少妇被强干到高潮视频在线观看| 在线不卡成人黄色精品| 小泽玛利亚视频在线观看| 97人妻色免费视频| 狠狠躁夜夜躁人人爽天天天天97 | 国产九色91在线视频| 欧美日本在线视频一区| 一区二区三区久久久91| 亚洲国产欧美一区二区三区久久| 国产在线免费观看成人| 在线观看国产网站资源| 亚洲欧美综合在线探花| 老司机99精品视频在线观看 | 特大黑人巨大xxxx| 天天干天天插天天谢| 女同性ⅹxx女同hd| 老师让我插进去69AV| 91免费观看在线网站| 经典亚洲伊人第一页| 午夜精品在线视频一区| 自拍 日韩 欧美激情| 在线可以看的视频你懂的 | 大胸性感美女羞爽操逼毛片| 色爱av一区二区三区| 男人的天堂一区二区在线观看| 少妇系列一区二区三区视频| 青青青视频自偷自拍38碰| 在线观看日韩激情视频| 亚洲 图片 欧美 图片| 亚洲1069综合男同| 大陆胖女人与丈夫操b国语高清 | 中文字幕之无码色多多| 18禁网站一区二区三区四区| 福利视频网久久91| 亚洲 色图 偷拍 欧美| 激情国产小视频在线| 在线观看欧美黄片一区二区三区| 天天干夜夜操天天舔| 丝袜国产专区在线观看| 国产麻豆剧果冻传媒app| 伊人综合免费在线视频| 国产97在线视频观看| 青娱乐在线免费视频盛宴| 欧美黄片精彩在线免费观看| 丁香花免费在线观看中文字幕| 偷拍自拍 中文字幕| 日韩av免费观看一区| 精品久久久久久久久久久99| 哥哥姐姐综合激情小说| 亚洲在线观看中文字幕av| weyvv5国产成人精品的视频| 国产视频一区在线观看| av大全在线播放免费| 日韩人妻丝袜中文字幕| 欧美viboss性丰满| 少妇人妻久久久久视频黄片| 黄网十四区丁香社区激情五月天 | 2022国产综合在线干| 亚洲高清视频在线不卡| 四虎永久在线精品免费区二区| 亚洲男人的天堂a在线| 可以免费看的www视频你懂的| 亚洲av琪琪男人的天堂| 欧美成人精品欧美一级黄色| 日本少妇高清视频xxxxx| 国产精品sm调教视频| 亚洲中文字字幕乱码| 国产1区,2区,3区| 欧美成人猛片aaaaaaa| 青青草原网站在线观看| 熟女91pooyn熟女| 欧美一区二区中文字幕电影| 黑人大几巴狂插日本少妇| 蜜桃久久久久久久人妻| 色噜噜噜噜18禁止观看| 蜜桃视频17c在线一区二区| 欧美一区二区三区啪啪同性| 亚洲成人情色电影在线观看| 2020中文字幕在线播放| 日韩一区二区电国产精品| 久久丁香婷婷六月天| 国产免费av一区二区凹凸四季| 欧洲亚洲欧美日韩综合| 日韩特级黄片高清在线看| 伊人综合aⅴ在线网| 精品久久久久久久久久久a√国产 日本女大学生的黄色小视频 | 亚洲综合图片20p| 最新日韩av传媒在线| 黄色视频成年人免费观看| 国产janese在线播放| 午夜极品美女福利视频| 五月天中文字幕内射| 丰满熟女午夜福利视频| 亚洲精品一线二线在线观看| 青青草视频手机免费在线观看| 在线观看免费视频色97| 精品成人啪啪18免费蜜臀| 51国产成人精品视频| 亚洲码av无色中文| 福利午夜视频在线合集| 国际av大片在线免费观看| 亚洲精品国偷自产在线观看蜜桃| 日韩剧情片电影在线收看| 天天操天天射天天操天天天| 久精品人妻一区二区三区| 97人人模人人爽人人喊| 国产片免费观看在线观看| 日本韩国亚洲综合日韩欧美国产| 国产日本精品久久久久久久| 国产精品sm调教视频| 色婷婷精品大在线观看| 午夜激情久久不卡一区二区| 日韩三级电影华丽的外出 | 亚洲精品无码色午夜福利理论片| 欧美日韩人妻久久精品高清国产| 日本美女成人在线视频| 99久久久无码国产精品性出奶水 | 欧美成人综合视频一区二区| 国产chinesehd精品麻豆| 日韩av中文在线免费观看| 免费国产性生活视频| 天天做天天干天天舔| 国产中文字幕四区在线观看| 美女视频福利免费看| 99亚洲美女一区二区三区| 老鸭窝在线观看一区| 经典亚洲伊人第一页| 亚洲精品 欧美日韩| 青青草视频手机免费在线观看| 综合色区亚洲熟妇shxstz| 国产精品人妻一区二区三区网站| 一区二区久久成人网| 最近中文2019年在线看| www,久久久,com| 男生舔女生逼逼视频| 久久精品亚洲成在人线a| 51国产偷自视频在线播放| 偷青青国产精品青青在线观看| 国产一区二区神马久久| 青青草亚洲国产精品视频| 99热久久这里只有精品| 2022国产综合在线干| 国产一级麻豆精品免费| 人妻av无码专区久久绿巨人| 欧美日韩人妻久久精品高清国产| 扒开腿挺进肉嫩小18禁视频| 中国把吊插入阴蒂的视频| 福利国产视频在线观看| 亚洲高清国产拍青青草原| 国产乱弄免费视频观看| 日韩亚洲高清在线观看| 欧美在线一二三视频| 亚洲成高清a人片在线观看| 黄色成年网站午夜在线观看| 亚洲综合图片20p| 国产之丝袜脚在线一区二区三区| 成人在线欧美日韩国产| 欧美精品久久久久久影院| yy6080国产在线视频| 91国偷自产一区二区三区精品| 在线免费观看国产精品黄色| yy96视频在线观看| 东京干手机福利视频| 免费在线观看视频啪啪| 中文字幕亚洲久久久| 动漫美女的小穴视频| 欧美亚洲牲夜夜综合久久| 亚洲激情偷拍一区二区| 在线视频免费观看网| 日本一区美女福利视频| av网址国产在线观看| 中文字幕在线一区精品| 天天操天天干天天日狠狠插| 成人乱码一区二区三区av| 75国产综合在线视频| 天堂av狠狠操蜜桃| 午夜大尺度无码福利视频| 麻豆精品成人免费视频| 久久精品国产999| 丝袜肉丝一区二区三区四区在线| 亚洲av日韩av第一区二区三区| 午夜大尺度无码福利视频| 超pen在线观看视频公开97| 在线观看免费av网址大全| 亚洲一区二区三区五区| av在线资源中文字幕| 最新国产亚洲精品中文在线| 国产熟妇人妻ⅹxxxx麻豆| 精品一区二区三四区| 女生自摸在线观看一区二区三区| 中文字幕av一区在线观看| 黄色视频成年人免费观看| 在线播放 日韩 av| 在线免费观看欧美小视频| 亚洲综合另类精品小说| 精品av国产一区二区三区四区| 天天做天天干天天操天天射| 精品久久久久久久久久久久人妻| 久久精品视频一区二区三区四区 | 亚洲av成人网在线观看| 亚洲欧美国产综合777| 国产视频在线视频播放| 激情内射在线免费观看| 亚洲天堂精品久久久| 亚洲国产成人av在线一区| 天天草天天色天天干| 欧美日本在线观看一区二区| 黄色录像鸡巴插进去| 欧美性受xx黑人性猛交| 91‖亚洲‖国产熟女| 一区二区三区四区五区性感视频| 欧美中文字幕一区最新网址| 中文字幕人妻三级在线观看| 日韩一区二区电国产精品| 国产精品自拍在线视频| 欧美成一区二区三区四区| 久久久精品999精品日本| 19一区二区三区在线播放| 日韩美女精品视频在线观看网站 | 亚洲欧美激情中文字幕| 黑人借宿ntr人妻的沦陷2| 日韩欧美一级黄片亚洲| 亚洲国产精品美女在线观看 | 黑人3p华裔熟女普通话| 亚洲va天堂va国产va久| 91久久国产成人免费网站| 国产亚洲精品欧洲在线观看| 91色秘乱一区二区三区| 最新日韩av传媒在线| 97人人模人人爽人人喊| 日本免费视频午夜福利视频| 91色秘乱一区二区三区| 亚洲av无乱一区二区三区性色| 特级无码毛片免费视频播放| 午夜美女福利小视频| 天天操天天爽天天干| 婷婷色中文亚洲网68| 亚洲一区自拍高清免费视频| 丝袜长腿第一页在线| av在线免费观看亚洲天堂| 午夜精品一区二区三区4| 日本成人一区二区不卡免费在线| 丝袜美腿视频诱惑亚洲无 | 久久艹在线观看视频| 2018最新中文字幕在线观看| 日日操夜夜撸天天干| 黑人巨大的吊bdsm| 亚洲男人在线天堂网| 一区二区在线观看少妇| 亚洲一区二区久久久人妻| av高潮迭起在线观看| 精品一区二区三区午夜| 亚洲精品无码久久久久不卡| 色吉吉影音天天干天天操| 91色秘乱一区二区三区| 韩国黄色一级二级三级| av高潮迭起在线观看| 亚洲高清自偷揄拍自拍| 黑人变态深video特大巨大| 99热这里只有精品中文| 成人av中文字幕一区| 最新国产精品拍在线观看| 国产精品久久久久久久精品视频| 国产精彩福利精品视频| 国产亚洲欧美视频网站| 都市家庭人妻激情自拍视频| 午夜激情高清在线观看| 一级A一级a爰片免费免会员| 91试看福利一分钟| 日韩av熟妇在线观看| www久久久久久久久久久| av森泽佳奈在线观看| 成人在线欧美日韩国产| 国产成人精品亚洲男人的天堂| 午夜精品福利91av| av破解版在线观看| 欧美另类重口味极品在线观看| 特一级特级黄色网片| 欧美亚洲一二三区蜜臀| 亚洲推理片免费看网站| 99精品国自产在线人| 熟女在线视频一区二区三区| 欧美区一区二区三视频| 亚洲精品三级av在线免费观看| 日韩剧情片电影在线收看| 国产一区二区火爆视频| 五十路熟女人妻一区二区9933| rct470中文字幕在线| 欧洲欧美日韩国产在线| 亚洲区欧美区另类最新章节| 亚洲成人黄色一区二区三区| 在线观看视频 你懂的| 日韩成人综艺在线播放| 日本韩国免费福利精品| 亚洲成人激情视频免费观看了 | 久久精品久久精品亚洲人| 中文字幕在线永久免费播放| 福利视频一区二区三区筱慧| 亚洲 图片 欧美 图片| 搞黄色在线免费观看| 亚洲一区久久免费视频| 91人妻人人做人人爽在线| 福利午夜视频在线观看| av在线播放国产不卡| 肏插流水妹子在线乐播下载| 91免费观看国产免费| 午夜在线观看一区视频| 黑人巨大精品欧美视频| 五十路老熟女码av| 久久丁香婷婷六月天| 国产91精品拍在线观看| 中国视频一区二区三区| 天美传媒mv视频在线观看| 青青青青青青青青青青草青青| 免费成人va在线观看| 在线不卡日韩视频播放| 亚洲1069综合男同| 一区二区三区蜜臀在线| 欧美成人小视频在线免费看| 国产第一美女一区二区三区四区| 久久久久久久99精品| 天天想要天天操天天干| 亚洲熟妇久久无码精品| 亚洲欧美综合在线探花| 日韩精品电影亚洲一区| 播放日本一区二区三区电影| 欧美日韩v中文在线| 亚洲欧洲一区二区在线观看| 国产成人无码精品久久久电影| 视频一区二区在线免费播放| 岛国黄色大片在线观看| 中文字幕一区二 区二三区四区| 91国内视频在线观看| 熟女妇女老妇一二三区| 国产黄色片在线收看| 经典av尤物一区二区| 精品国产污污免费网站入口自| 免费十精品十国产网站| 91久久精品色伊人6882| 国产一区av澳门在线观看| 五十路熟女av天堂| 亚洲精品 欧美日韩| h国产小视频福利在线观看| 色天天天天射天天舔| 91亚洲手机在线视频播放| 91久久人澡人人添人人爽乱| 人人在线视频一区二区| 久久久超爽一二三av| 男人操女人的逼免费视频| 国产视频在线视频播放| 欧美精品欧美极品欧美视频| 在线视频精品你懂的| 五月天久久激情视频| 任你操视频免费在线观看| 日本少妇精品免费视频| av天堂资源最新版在线看| 国产成人一区二区三区电影网站| av欧美网站在线观看| 亚洲欧美另类手机在线| 农村胖女人操逼视频| av无限看熟女人妻另类av| 在线国产精品一区二区三区| 中文字幕av熟女人妻| 不卡日韩av在线观看| 大香蕉大香蕉在线有码 av| 激情五月婷婷综合色啪| aⅴ精产国品一二三产品| 欧美麻豆av在线播放| 中文字幕av男人天堂| 亚洲va天堂va国产va久| 中文字幕在线观看国产片| 免费看国产又粗又猛又爽又黄视频 | 国产chinesehd精品麻豆| 欧美精产国品一二三产品价格| 免费看美女脱光衣服的视频| 国产av自拍偷拍盛宴| 99精品国产自在现线观看| 骚逼被大屌狂草视频免费看| 黄片大全在线观看观看| 97少妇精品在线观看| 香港三日本三韩国三欧美三级| 91精品国产91久久自产久强| 成人性黑人一级av| 午夜精品久久久久久99热| 成人伊人精品色xxxx视频| 中文字幕在线观看极品视频| 亚洲国产精品美女在线观看 | 亚洲国产美女一区二区三区软件 | 一区二区久久成人网| 888欧美视频在线| 黑人解禁人妻叶爱071| 亚洲欧美国产综合777| 亚洲国产成人在线一区| 2025年人妻中文字幕乱码在线| 亚洲国产成人无码麻豆艾秋| 精品人妻每日一部精品| 日韩av熟妇在线观看| 亚洲人一区二区中文字幕| 日韩不卡中文在线视频网站| 91精品资源免费观看| 在线视频免费观看网| 成人午夜电影在线观看 久久| 亚洲av午夜免费观看| 国产高清精品一区二区三区| 91在线免费观看成人| 日本高清在线不卡一区二区| 国产精品黄色的av| 青青青激情在线观看视频| 天天摸天天日天天操| 成人在线欧美日韩国产| 只有精品亚洲视频在线观看| 在线观看成人国产电影| 亚洲精品午夜aaa久久| 熟女人妻在线观看视频| 一级a看免费观看网站| 97超碰免费在线视频| 青青青爽视频在线播放| 国产日本欧美亚洲精品视| 伊人精品福利综合导航| 在线免费观看日本伦理| 五十路人妻熟女av一区二区| 天天射夜夜操狠狠干| 欧美亚洲一二三区蜜臀| 亚洲特黄aaaa片| 伊人成人在线综合网| 日本阿v视频在线免费观看| 动漫精品视频在线观看| 日本性感美女写真视频| 青青草成人福利电影| 国产一级麻豆精品免费| 国产成人无码精品久久久电影| 高清一区二区欧美系列| 天天日天天操天天摸天天舔| 亚洲1区2区3区精华液| 99精品国产aⅴ在线观看| 亚洲欧美激情国产综合久久久| 99国产精品窥熟女精品| 大香蕉玖玖一区2区| av天堂资源最新版在线看| 91精品国产91青青碰| 欧美老鸡巴日小嫩逼| 一级黄色片夫妻性生活| 97超碰最新免费在线观看| 春色激情网欧美成人| 端庄人妻堕落挣扎沉沦| 国产成人无码精品久久久电影| 性感美女福利视频网站| 97小视频人妻一区二区| 亚洲麻豆一区二区三区| 好了av中文字幕在线| 亚洲av可乐操首页| 91人妻人人做人人爽在线| 精品乱子伦一区二区三区免费播| 欧美精品国产综合久久| 色97视频在线播放| 日韩激情文学在线视频 | 亚洲av一妻不如妾| 97人妻人人澡爽人人精品| 黑人借宿ntr人妻的沦陷2| 蜜臀av久久久久蜜臀av麻豆| 91精品国产综合久久久蜜| 九色视频在线观看免费| 日韩国产乱码中文字幕| 日本女人一级免费片| 三上悠亚和黑人665番号| 亚洲高清免费在线观看视频| 五十路熟女人妻一区二| 好男人视频在线免费观看网站| 免费无毒热热热热热热久| 天天综合天天综合天天网| 最新黄色av网站在线观看| 日本人妻少妇18—xx| 国产精品久久久久国产三级试频 | 黄色录像鸡巴插进去| 欧美亚洲一二三区蜜臀| 亚洲欧洲av天堂综合| 亚洲激情av一区二区| 国产精品视频男人的天堂| 成人24小时免费视频| 久久这里只有精彩视频免费| 男人在床上插女人视频| 97香蕉碰碰人妻国产樱花| 黄色三级网站免费下载| 日本午夜爽爽爽爽爽视频在线观看 | 激情小视频国产在线| 热久久只有这里有精品| 色狠狠av线不卡香蕉一区二区| 一区二区三区激情在线| 精品人人人妻人人玩日产欧| 亚洲av极品精品在线观看| 亚洲一区二区三区精品视频在线| 国产成人精品一区在线观看 | 天天艹天天干天天操| 人妻少妇一区二区三区蜜桃| 精品一区二区亚洲欧美| 香蕉片在线观看av| 懂色av蜜桃a v| 免费成人va在线观看| 中国视频一区二区三区| 日本www中文字幕| 91麻豆精品传媒国产黄色片| 亚洲区美熟妇久久久久| 欧美视频不卡一区四区| 国产一线二线三线的区别在哪| 大鸡吧插逼逼视频免费看| 国产综合视频在线看片| 天天日天天爽天天爽| 少妇ww搡性bbb91| 男人和女人激情视频| 国产精品污污污久久| 青青青激情在线观看视频| 日韩欧美高清免费在线| 在线观看av亚洲情色| 91九色国产porny蝌蚪| 2012中文字幕在线高清| 91she九色精品国产| 91精品一区二区三区站长推荐| 婷婷色国产黑丝少妇勾搭AV| 欧美第一页在线免费观看视频| 骚逼被大屌狂草视频免费看| 亚洲熟女女同志女同| 在线制服丝袜中文字幕| 国产精彩对白一区二区三区| 亚洲免费国产在线日韩| 天天射,天天操,天天说| 天堂va蜜桃一区入口| 香蕉片在线观看av| 中国黄色av一级片| 11久久久久久久久久久| 亚洲午夜电影之麻豆| 91国内精品久久久久精品一| 超碰97免费人妻麻豆| av视网站在线观看| 日本一本午夜在线播放| 大陆av手机在线观看| 中国黄片视频一区91| 国产精品久久久久久久精品视频| 蜜桃专区一区二区在线观看| 国产真实乱子伦a视频| 精品区一区二区三区四区人妻 | 91精品一区二区三区站长推荐| 欧美精品中文字幕久久二区| 91啪国自产中文字幕在线| 欧美色呦呦最新网址| 国产精品三级三级三级| 岛国一区二区三区视频在线| www日韩毛片av| 老师啊太大了啊啊啊尻视频| 午夜美女少妇福利视频| gay gay男男瑟瑟在线网站| 狍和女人的王色毛片| 亚洲精品 日韩电影| 夜色撩人久久7777| 午夜91一区二区三区| 大鸡巴操b视频在线| 日韩在线中文字幕色| 久久www免费人成一看片| 天天日天天摸天天爱| 成人午夜电影在线观看 久久| 亚洲国产香蕉视频在线播放| 天天日天天舔天天射进去| chinese国产盗摄一区二区| 天天操夜夜骑日日摸| 97成人免费在线观看网站| av无限看熟女人妻另类av| 人妻熟女中文字幕aⅴ在线| 东京干手机福利视频| 99精品免费观看视频| 亚洲 欧美 精品 激情 偷拍| 欧美精品亚洲精品日韩在线| 做爰视频毛片下载蜜桃视频1| 欧美日韩情色在线观看| 美女av色播在线播放| 亚洲另类在线免费观看| 国产精品一区二区三区蜜臀av | 国产一级麻豆精品免费| 亚洲免费视频欧洲免费视频| 天天摸天天日天天操| 亚洲国产中文字幕啊啊啊不行了| 日本少妇高清视频xxxxx| 不卡一区一区三区在线| 国产亚洲精品视频合集| 亚洲一区二区三区精品视频在线| 成人免费毛片aaaa| 福利片区一区二体验区| 亚洲熟女久久久36d| 精品人妻一二三区久久| 啊啊好慢点插舔我逼啊啊啊视频 | 国产真实乱子伦a视频| 精品国产在线手机在线| 亚洲一区自拍高清免费视频| 97黄网站在线观看| 国产不卡av在线免费| 国产精品黄页网站视频| 97超碰人人搞人人| 亚洲推理片免费看网站| 成人在线欧美日韩国产| 自拍偷拍,中文字幕| 硬鸡巴动态操女人逼视频| 国产高清女主播在线| 欧美亚洲自偷自拍 在线| 韩国女主播精品视频网站| 福利视频网久久91| 人妻另类专区欧美制服| 亚洲av日韩av网站| 美女福利视频导航网站| 亚洲精品一区二区三区老狼| 青青青aaaa免费| 青青青青青青青青青国产精品视频| av亚洲中文天堂字幕网| 亚洲熟女久久久36d| 欧美激情电影免费在线| 欧美日韩高清午夜蜜桃大香蕉| 天天日天天日天天擦| 国产九色91在线观看精品| 非洲黑人一级特黄片| 日韩特级黄片高清在线看| 成人免费公开视频无毒| 欧美精品一区二区三区xxxx| 99热这里只有国产精品6| 老熟妇xxxhd老熟女| 国产视频网站一区二区三区 | 日本裸体熟妇区二区欧美| 一区二区三区美女毛片| 日本在线不卡免费视频| 亚洲一级特黄特黄黄色录像片| 亚洲久久午夜av一区二区| 97精品成人一区二区三区| 欧美麻豆av在线播放| 人妻熟女中文字幕aⅴ在线| 免费一级特黄特色大片在线观看| 99re6热在线精品| 中文字幕在线乱码一区二区| 亚洲欧美久久久久久久久| sejizz在线视频| 和邻居少妇愉情中文字幕| 日本免费视频午夜福利视频| 亚洲精品三级av在线免费观看| 日韩av有码中文字幕| 1000小视频在线| 亚洲成人情色电影在线观看| 性欧美激情久久久久久久| 精彩视频99免费在线| 18禁精品网站久久| 国产精品熟女久久久久浪潮| av在线免费观看亚洲天堂| 国产精品一区二区av国| 91精品国产91久久自产久强| 久久艹在线观看视频| 亚洲最大免费在线观看| 韩国爱爱视频中文字幕| 1区2区3区4区视频在线观看| av在线观看网址av| 欧美va亚洲va天堂va| 淫秽激情视频免费观看| 首之国产AV医生和护士小芳| 人人妻人人爱人人草| 色婷婷综合激情五月免费观看| 亚洲伊人色一综合网| 国产黄色大片在线免费播放 | 婷婷久久一区二区字幕网址你懂得| 欧美少妇性一区二区三区| 97精品综合久久在线| 国产精品入口麻豆啊啊啊| 免费观看理论片完整版| 姐姐的朋友2在线观看中文字幕| 蜜桃视频入口久久久| 亚洲欧美色一区二区| 国产97视频在线精品| 亚洲超碰97人人做人人爱| 日韩一个色综合导航| 青青草在观免费国产精品| 11久久久久久久久久久| 亚洲欧美国产综合777| mm131美女午夜爽爽爽| 成年人黄视频在线观看| 2021久久免费视频| 91久久精品色伊人6882| 大黑人性xxxxbbbb| 97国产在线观看高清| 日韩激情文学在线视频| 日韩a级精品一区二区| 日本免费视频午夜福利视频| 女生被男生插的视频网站| 青青青青青青青青青青草青青 | 日本一二三区不卡无| 日本免费视频午夜福利视频| 亚洲av自拍天堂网| 免费在线看的黄片视频| 天天做天天干天天操天天射| 啪啪啪18禁一区二区三区| 亚洲中文字字幕乱码| 国产白嫩美女一区二区| 强行扒开双腿猛烈进入免费版| 99久久久无码国产精品性出奶水 | 黄色av网站免费在线| 国际av大片在线免费观看| 青青草视频手机免费在线观看| 玩弄人妻熟妇性色av少妇| 国产精品三级三级三级| 91片黄在线观看喷潮| 久久久久久国产精品| 欧美日韩国产一区二区三区三州| caoporm超碰国产| 97超碰人人搞人人| 91麻豆精品91久久久久同性| 精品视频一区二区三区四区五区| av中文字幕电影在线看| 人妻无码中文字幕专区| 99精品国自产在线人| 沙月文乃人妻侵犯中文字幕在线 | 特级无码毛片免费视频播放| 九色精品视频在线播放| 在线免费91激情四射 | 红杏久久av人妻一区| 高清成人av一区三区| 美女福利写真在线观看视频| 干逼又爽又黄又免费的视频| 欧美成人一二三在线网| 97年大学生大白天操逼| 91免费放福利在线观看| 日韩人妻丝袜中文字幕| 早川濑里奈av黑人番号| 91人妻精品一区二区久久| 人妻熟女中文字幕aⅴ在线| 亚洲av无码成人精品区辽| 青青青青青免费视频| 国产男女视频在线播放| av手机在线观播放网站| 538精品在线观看视频| 日韩中文字幕福利av| 在线观看免费岛国av| 亚洲欧美精品综合图片小说| 欧美精品 日韩国产| 大鸡巴操娇小玲珑的女孩逼| 人妻少妇性色欲欧美日韩| 2020国产在线不卡视频| 欧美日本在线视频一区| 顶级尤物粉嫩小尤物网站| 黄片大全在线观看观看| 91精品一区二区三区站长推荐| 一区二区在线视频中文字幕| 中文字幕乱码av资源| 年轻的人妻被夫上司侵犯| 亚洲成人熟妇一区二区三区| 综合激情网激情五月天| 中国黄色av一级片| 亚洲偷自拍高清视频| 一区二区三区欧美日韩高清播放| 亚洲福利精品视频在线免费观看 | 亚洲乱码中文字幕在线| av资源中文字幕在线观看| 欧美日韩精品永久免费网址 | heyzo蜜桃熟女人妻| 欧美中国日韩久久精品| 无码精品一区二区三区人| 成人资源在线观看免费官网| 婷婷久久久综合中文字幕| 国产精品久久综合久久| 欧亚日韩一区二区三区观看视频 | 经典国语激情内射视频| 午夜在线观看一区视频| 久久美欧人妻少妇一区二区三区 | 亚洲综合自拍视频一区| 小泽玛利亚视频在线观看| 51精品视频免费在线观看| 青青青青青免费视频| 日本三极片视频网站观看| 中文字幕av熟女人妻| 亚洲图片欧美校园春色| 同居了嫂子在线播高清中文| 51国产偷自视频在线播放| 欧美精产国品一二三产品区别大吗| 在线观看免费岛国av| 中文字幕免费在线免费| 日韩美女精品视频在线观看网站| 国产午夜福利av导航| 国产精品久久久黄网站| 久久精品国产亚洲精品166m| 国产精品国产精品一区二区| 亚洲免费福利一区二区三区| 色av色婷婷人妻久久久精品高清| 国产清纯美女al在线| 视频二区在线视频观看| 阴茎插到阴道里面的视频| 黑人巨大的吊bdsm| 少妇高潮无套内谢麻豆| 人妻无码中文字幕专区| 国产亚洲天堂天天一区| 国产麻豆乱子伦午夜视频观看| 国产午夜激情福利小视频在线| 国产福利在线视频一区| 欧美黑人性暴力猛交喷水| 久久久极品久久蜜桃| 偷拍美女一区二区三区| 国产揄拍高清国内精品对白| 日本韩国免费一区二区三区视频 | 精品成人午夜免费看| 精品视频国产在线观看| 99精品国产自在现线观看| 国产精品亚洲а∨天堂免| 91色网站免费在线观看| 亚洲中文精品人人免费| 欧美精产国品一二三产品价格| 亚洲超碰97人人做人人爱| 国产福利小视频大全| 老熟妇凹凸淫老妇女av在线观看| 人人妻人人澡欧美91精品| 亚洲国产精品久久久久蜜桃| 伊人综合免费在线视频| 只有精品亚洲视频在线观看| 欧美成人精品在线观看| 欧美va不卡视频在线观看| 精品少妇一二三视频在线| 亚洲第一黄色在线观看| 少妇与子乱在线观看| 久久精品亚洲国产av香蕉| caoporm超碰国产| 午夜精品九一唐人麻豆嫩草成人| 亚洲区美熟妇久久久久| 综合精品久久久久97| 在线免费91激情四射 | 国产精品黄页网站视频| 熟女人妻一区二区精品视频| 欧美老妇精品另类不卡片| 韩国爱爱视频中文字幕| 天天日天天干天天舔天天射| 久久综合老鸭窝色综合久久 | 绝色少妇高潮3在线观看| 成人高潮aa毛片免费| 综合一区二区三区蜜臀| 婷婷综合蜜桃av在线| 中文字幕,亚洲人妻| 无码精品一区二区三区人| 香蕉aⅴ一区二区三区| 中文字幕人妻三级在线观看| 亚洲超碰97人人做人人爱| 男人靠女人的逼视频| 亚洲av无码成人精品区辽| 99热这里只有精品中文| 久草福利电影在线观看| 午夜的视频在线观看| 老司机99精品视频在线观看| 成人午夜电影在线观看 久久| 日韩国产乱码中文字幕| 天天操天天弄天天射| 一区国内二区日韩三区欧美| 国产男女视频在线播放| 亚洲av色图18p| 99久久99一区二区三区| 亚洲精品精品国产综合| 沙月文乃人妻侵犯中文字幕在线| 中文字幕一区二区亚洲一区| 成人免费做爰高潮视频| 亚洲成高清a人片在线观看| 亚洲va国产va欧美va在线| 老有所依在线观看完整版 | 桃色视频在线观看一区二区| wwwxxx一级黄色片| 福利视频广场一区二区| 国产变态另类在线观看| 亚洲精品一线二线在线观看| 免费一级黄色av网站| 国产V亚洲V天堂无码欠欠| 大鸡八强奸视频在线观看| 日日夜夜精品一二三| 狠狠的往里顶撞h百合| 91精品免费久久久久久| 国产日韩精品电影7777| 国产三级片久久久久久久| 综合一区二区三区蜜臀| 亚洲久久午夜av一区二区| 男生舔女生逼逼的视频| 男生用鸡操女生视频动漫| 日韩影片一区二区三区不卡免费| 欧美一区二区三区久久久aaa| 日本高清在线不卡一区二区| 又大又湿又爽又紧A视频| japanese五十路熟女熟妇| 中文字幕av男人天堂| 年轻的人妻被夫上司侵犯| 班长撕开乳罩揉我胸好爽| 黄色资源视频网站日韩| av天堂加勒比在线| 午夜精品一区二区三区福利视频| 国产成人精品av网站| 亚洲精品乱码久久久久久密桃明| 国产日本欧美亚洲精品视| 男人和女人激情视频| 亚洲1卡2卡三卡4卡在线观看| 色婷婷精品大在线观看| 好吊视频—区二区三区| 视频一区 二区 三区 综合| 天天日天天日天天射天天干 | 亚洲一区二区人妻av| 视频二区在线视频观看| 北条麻妃av在线免费观看| 中文字幕奴隷色的舞台50| 国产大鸡巴大鸡巴操小骚逼小骚逼| 中国无遮挡白丝袜二区精品| 国产之丝袜脚在线一区二区三区 | 视频啪啪啪免费观看| 一级黄片久久久久久久久| 青草亚洲视频在线观看| 黄色三级网站免费下载| 亚洲无码一区在线影院| 97人妻色免费视频| 欧美日韩精品永久免费网址| 黄色成年网站午夜在线观看| 亚洲一级特黄特黄黄色录像片| 2022国产精品视频| 韩国亚洲欧美超一级在线播放视频| 91av中文视频在线| 91chinese在线视频| 91一区精品在线观看| 五十路av熟女松本翔子| 五十路熟女人妻一区二| 日本av熟女在线视频| 超碰中文字幕免费观看| 人人妻人人爽人人澡人人精品| 中文字幕国产专区欧美激情| 大鸡巴插入美女黑黑的阴毛| 爱有来生高清在线中文字幕| 超黄超污网站在线观看| 粉嫩av蜜乳av蜜臀| 欧美视频中文一区二区三区| 最新的中文字幕 亚洲| 亚洲精品国偷自产在线观看蜜桃| 91chinese在线视频| 日日日日日日日日夜夜夜夜夜夜| 人妻自拍视频中国大陆| 成人久久精品一区二区三区| 57pao国产一区二区| av中文字幕电影在线看| 亚洲综合图片20p| 亚洲精品色在线观看视频| 密臀av一区在线观看| 91欧美在线免费观看| 最新国产亚洲精品中文在线| 一区二区三区国产精选在线播放 | 欧美性受xx黑人性猛交| 伊人综合aⅴ在线网| 青青草成人福利电影| 亚洲综合在线视频可播放| 狠狠躁夜夜躁人人爽天天天天97| 久久精品视频一区二区三区四区| 91麻豆精品91久久久久同性| 天天干天天操天天扣| 国产剧情演绎系列丝袜高跟| 亚洲午夜电影在线观看| 亚洲一级av大片免费观看| 天天日天天鲁天天操| 人妻久久无码中文成人| 国产精品久久久久久久女人18| 午夜精品福利一区二区三区p| 人妻另类专区欧美制服| 亚洲熟妇久久无码精品| 91免费放福利在线观看| 欧美亚洲偷拍自拍色图| aiss午夜免费视频| 在线观看视频污一区| 精品高跟鞋丝袜一区二区| 国产精品久久久久久美女校花| 亚洲精品麻豆免费在线观看| xxx日本hd高清| 中文字幕人妻三级在线观看| 白白操白白色在线免费视频| 亚洲欧美另类手机在线| 班长撕开乳罩揉我胸好爽| 国产露脸对白在线观看| 在线免费观看黄页视频| mm131美女午夜爽爽爽| 最新97国产在线视频| 日本三极片中文字幕| 粉嫩av蜜乳av蜜臀| 自拍偷拍亚洲精品第2页| 国产之丝袜脚在线一区二区三区| 国产av国片精品一区二区| 夜夜嗨av蜜臀av| 亚洲一区二区人妻av| www,久久久,com| 狠狠操操操操操操操操操| 果冻传媒av一区二区三区| 日韩欧美一级精品在线观看| 99久久99一区二区三区| 亚洲精品成人网久久久久久小说| 亚洲自拍偷拍综合色| 午夜激情久久不卡一区二区 | 中文字幕无码日韩专区免费| 欧美一区二区三区激情啪啪啪 | 无忧传媒在线观看视频| 亚洲高清视频在线不卡| 久久久91蜜桃精品ad| 亚洲免费福利一区二区三区| av中文字幕在线导航| 亚洲av日韩高清hd| 亚洲激情偷拍一区二区| 男人靠女人的逼视频| 成人精品视频99第一页| 日本在线不卡免费视频| 免费费一级特黄真人片 | 欧美黑人巨大性xxxxx猛交| 超污视频在线观看污污污| 91九色国产熟女一区二区| 2020久久躁狠狠躁夜夜躁| 久草极品美女视频在线观看| 蝴蝶伊人久久中文娱乐网| 97瑟瑟超碰在线香蕉| 亚洲日本一区二区三区| sw137 中文字幕 在线| 久久这里只有精彩视频免费| 人妻丰满熟妇综合网| 亚洲综合另类欧美久久| 91国产在线视频免费观看| 久久久制服丝袜中文字幕| 亚洲 国产 成人 在线| 国产精品三级三级三级| 粗大的内捧猛烈进出爽大牛汉子| 亚洲精品色在线观看视频| 欧美成一区二区三区四区| 91破解版永久免费| 免费观看丰满少妇做受| 欧美黑人与人妻精品| 成年美女黄网站18禁久久| 91九色porny国产在线| 日韩熟女av天堂系列| 国产欧美精品不卡在线| 日本性感美女写真视频| 97人人妻人人澡人人爽人人精品| 欧美精品一二三视频| 成人18禁网站在线播放| 国产视频网站国产视频| 国产剧情演绎系列丝袜高跟| 91色九色porny| 天天干天天操天天爽天天摸| 日本在线一区二区不卡视频| 国产在线自在拍91国语自产精品| 天天日天天天天天天天天天天| 超污视频在线观看污污污 | 久久这里有免费精品| 国产成人精品久久二区91| 91大神福利视频网| 国产视频在线视频播放| 中文字幕午夜免费福利视频| 天天干天天操天天摸天天射| 亚洲av黄色在线网站| 青青青青青青草国产| 国产日本欧美亚洲精品视| 欧美中国日韩久久精品| 久久h视频在线观看| 日本少妇人妻xxxxx18| 欧洲国产成人精品91铁牛tv| 大陆av手机在线观看| www久久久久久久久久久| 日本啪啪啪啪啪啪啪| 亚洲少妇高潮免费观看| 3D动漫精品啪啪一区二区下载| 日韩人妻丝袜中文字幕| 日韩欧美一级aa大片| 欧美成一区二区三区四区| 粉嫩av懂色av蜜臀av| av在线免费资源站| 同居了嫂子在线播高清中文| 久久久人妻一区二区| 白白操白白色在线免费视频| 大学生A级毛片免费视频| 日本av在线一区二区三区| 夜夜操,天天操,狠狠操| 中文字幕第一页国产在线| 沙月文乃人妻侵犯中文字幕在线| 57pao国产一区二区| 少妇人妻二三区视频| 欧美精品一区二区三区xxxx| 亚洲精品亚洲人成在线导航| 午夜精品一区二区三区4| 新婚人妻聚会被中出| 性生活第二下硬不起来| 亚洲熟妇久久无码精品| 欧美国产亚洲中英文字幕| 亚洲男人的天堂a在线| 一区二区三区欧美日韩高清播放| 中文字幕无码一区二区免费| 2018最新中文字幕在线观看| 91she九色精品国产| 欧洲亚洲欧美日韩综合| 亚洲av无码成人精品区辽| 一区二区在线视频中文字幕 | 欧美精产国品一二三区| 国产精品sm调教视频| 国产一区二区火爆视频 | 美女吃鸡巴操逼高潮视频| 日韩不卡中文在线视频网站| 色狠狠av线不卡香蕉一区二区| 性色av一区二区三区久久久 | 亚洲午夜福利中文乱码字幕| 中文字幕在线观看国产片| 视频一区 二区 三区 综合| 视频一区 视频二区 视频| 97色视频在线观看| 国产三级片久久久久久久| 好了av中文字幕在线| 精品suv一区二区69| 国产精品视频资源在线播放| 中文字幕高清免费在线人妻| 中文字日产幕乱六区蜜桃| 欧美日韩激情啪啪啪| 日韩欧美亚洲熟女人妻| 美女福利写真在线观看视频| 精品国产乱码一区二区三区乱| 国产内射中出在线观看| 天天干夜夜操啊啊啊| 亚洲国产在人线放午夜| 天天综合天天综合天天网| 国产麻豆剧传媒精品国产av蜜桃| 亚洲国产在线精品国偷产拍| 亚洲中文字字幕乱码| 人妻无码中文字幕专区| 国产性生活中老年人视频网站| 福利午夜视频在线观看| 丁香花免费在线观看中文字幕| 亚洲av日韩av网站| 久久99久久99精品影院| 美女 午夜 在线视频| 亚洲综合在线视频可播放| 日韩精品二区一区久久| 18禁美女羞羞免费网站| 自拍偷拍 国产资源| 一区二区视频视频视频| 久久这里只有精品热视频| 91国内视频在线观看| 欧美一级视频一区二区| 亚洲欧美一区二区三区电影| 伊人综合免费在线视频| 91精品激情五月婷婷在线| 五十路熟女人妻一区二区9933| 欧美男人大鸡吧插女人视频| 天堂av在线播放免费| 国产亚州色婷婷久久99精品| 日韩北条麻妃一区在线| 日韩欧美国产精品91| rct470中文字幕在线| 亚洲 欧美 精品 激情 偷拍 | 99精品国自产在线人| 亚洲 清纯 国产com| 青青青视频手机在线观看| 日韩伦理短片在线观看| 制服丝袜在线人妻中文字幕| 色av色婷婷人妻久久久精品高清| rct470中文字幕在线| 午夜久久久久久久精品熟女| 欧美亚洲国产成人免费在线| 亚洲av男人天堂久久| 免费成人va在线观看| 在线播放一区二区三区Av无码| 视频一区二区在线免费播放| 大学生A级毛片免费视频| 日本18禁久久久久久| 亚洲另类图片蜜臀av| av在线免费中文字幕| 75国产综合在线视频| 国产乱子伦精品视频潮优女| 国产精品自偷自拍啪啪啪| 国产免费高清视频视频| 欧美日韩v中文在线| 久久久久久九九99精品| 亚洲国产美女一区二区三区软件| 国产亚洲视频在线观看| 2022国产精品视频| 中文字幕乱码人妻电影| 91精品视频在线观看免费| 家庭女教师中文字幕在线播放| 九一传媒制片厂视频在线免费观看| 日本高清撒尿pissing| 农村胖女人操逼视频| 天天操天天干天天艹| 亚洲av色图18p| 少妇深喉口爆吞精韩国| 在线观看视频一区麻豆| 欧美精品中文字幕久久二区| 女同久久精品秋霞网| 久久久精品欧洲亚洲av| 国产精品黄片免费在线观看| 中文字幕一区二 区二三区四区| 免费啪啪啪在线观看视频| 日本www中文字幕| 中文字幕乱码人妻电影| 青草久久视频在线观看| 亚洲欧美清纯唯美另类| 人妻少妇亚洲一区二区| 久草视频中文字幕在线观看| 中文字幕一区二区人妻电影冢本| 成年人黄色片免费网站| 成年午夜免费无码区| 国产亚洲精品欧洲在线观看| 动漫美女的小穴视频| 在线观看日韩激情视频| 粉嫩欧美美人妻小视频| 人妻丝袜精品中文字幕| 91九色porny国产蝌蚪视频| 最新激情中文字幕视频| 18禁网站一区二区三区四区| 亚洲专区激情在线观看视频| 美女福利视频网址导航| 中文字母永久播放1区2区3区| 大香蕉伊人中文字幕| jiujiure精品视频在线| 日韩av免费观看一区| 欧美精产国品一二三产品价格| 大屁股熟女一区二区三区| 动漫精品视频在线观看| 19一区二区三区在线播放| 五月天中文字幕内射| 亚洲美女高潮喷浆视频| 天天日天天做天天日天天做| 福利国产视频在线观看| 伊人综合免费在线视频| 精品美女在线观看视频在线观看| 欧美色呦呦最新网址| av乱码一区二区三区| 清纯美女在线观看国产| 噜噜色噜噜噜久色超碰| 国产精品日韩欧美一区二区| 日韩加勒比东京热二区| 端庄人妻堕落挣扎沉沦| 欧美视频中文一区二区三区| 蜜桃视频入口久久久| 最新国产精品网址在线观看| 男生用鸡操女生视频动漫 | 国产精品入口麻豆啊啊啊| 亚洲图库另类图片区| 香港三日本三韩国三欧美三级| 又大又湿又爽又紧A视频| 中文字幕,亚洲人妻| 大胸性感美女羞爽操逼毛片| 91人妻人人做人人爽在线| 久久精品在线观看一区二区| 在线免费观看亚洲精品电影| 国产女人叫床高潮大片视频| 日韩加勒比东京热二区| 天天操天天插天天色| 91综合久久亚洲综合| 中文字幕视频一区二区在线观看| 精品亚洲中文字幕av| 国产丰满熟女成人视频| 亚洲福利天堂久久久久久| 亚洲视频在线观看高清| 男生舔女生逼逼视频| 天天日天天操天天摸天天舔| 亚洲国产精品久久久久蜜桃| jiuse91九色视频| 漂亮 人妻被中出中文| 97小视频人妻一区二区| 动漫美女的小穴视频| 日韩熟女系列一区二区三区| 亚洲中文字幕校园春色| 77久久久久国产精产品| 欧美成一区二区三区四区| 欧美精产国品一二三区| 久久久久只精品国产三级| 成人高清在线观看视频| 姐姐的朋友2在线观看中文字幕 | 亚洲成av人无码不卡影片一| 美女操逼免费短视频下载链接| 夏目彩春在线中文字幕| 福利一二三在线视频观看| 午夜蜜桃一区二区三区| 国产av一区2区3区| 天堂资源网av中文字幕| 亚洲高清视频在线不卡| 天堂v男人视频在线观看| 欧洲国产成人精品91铁牛tv| 国产伊人免费在线播放| 亚洲卡1卡2卡三卡四老狼| 欧美国品一二三产区区别| 99久久99久国产黄毛片| 婷婷六月天中文字幕| 国产女人露脸高潮对白视频| 国产又色又刺激在线视频| 91九色porny国产在线| 日本成人一区二区不卡免费在线| 国产欧美日韩在线观看不卡| 搡老妇人老女人老熟女| 久久午夜夜伦痒痒想咳嗽P| 97人人模人人爽人人喊| 最新中文字幕免费视频| 亚洲一区二区人妻av| 国产视频一区二区午夜| 国产精品欧美日韩区二区| 黄网十四区丁香社区激情五月天 | 久久久精品精品视频视频| 日韩av免费观看一区| 91欧美在线免费观看| 欧美日本aⅴ免费视频| 欧美精品黑人性xxxx| 久久久久91精品推荐99| 人妻爱爱 中文字幕| 美女张开腿让男生操在线看| 中文字幕乱码人妻电影| 免费观看丰满少妇做受| 国产视频一区二区午夜| 噜噜色噜噜噜久色超碰| 丝袜国产专区在线观看| 不戴胸罩引我诱的隔壁的人妻| 欧美精品一二三视频| 中文字幕在线永久免费播放| 女警官打开双腿沦为性奴| 在线成人日韩av电影| 国产一区成人在线观看视频| 中文字幕成人日韩欧美| 亚洲天堂第一页中文字幕| 国产精品福利小视频a| 一级a看免费观看网站| 无码精品一区二区三区人| 国产午夜男女爽爽爽爽爽视频 | 亚洲 中文 自拍 另类 欧美| 欧美亚洲少妇福利视频| 日本脱亚入欧是指什么| 毛片av在线免费看| 国产性生活中老年人视频网站| 自拍偷拍亚洲精品第2页| 女同性ⅹxx女同hd| 东京干手机福利视频| 91老熟女连续高潮对白| 日本熟妇丰满厨房55| 欧美黑人与人妻精品| 粉嫩小穴流水视频在线观看| 精品视频国产在线观看| 欧美成人一二三在线网| 啊啊好大好爽啊啊操我啊啊视频| 大屁股熟女一区二区三区| av在线免费资源站| 午夜精品一区二区三区福利视频| 亚洲欧美综合另类13p| 精内国产乱码久久久久久| 55夜色66夜色国产精品站| av破解版在线观看| 亚洲av天堂在线播放| 在线观看操大逼视频| 91精品国产综合久久久蜜 | 丰满的继坶3中文在线观看| 午夜精彩视频免费一区| 成人高清在线观看视频| 成年午夜免费无码区| 18禁网站一区二区三区四区 | 日韩a级黄色小视频| 亚洲少妇高潮免费观看| 精品高潮呻吟久久av| 四川乱子伦视频国产vip| 欧美韩国日本国产亚洲| 亚洲av极品精品在线观看| 美女张开两腿让男人桶av| 亚洲精品色在线观看视频| 啪啪啪18禁一区二区三区| 大陆胖女人与丈夫操b国语高清| 久久久久久国产精品| 久草视频首页在线观看| 日本av熟女在线视频| 99热碰碰热精品a中文| 精品一区二区三区在线观看| 亚洲国产精品久久久久久6| 日本人妻少妇18—xx| 97人妻夜夜爽二区欧美极品| 久久热久久视频在线观看| 欧美精品伦理三区四区| 亚洲人妻av毛片在线| 成年人的在线免费视频| 天天射夜夜操狠狠干| 国产使劲操在线播放| 黑人巨大精品欧美视频| 国产精品人妻熟女毛片av久| 亚洲综合乱码一区二区| 亚洲国产欧美一区二区丝袜黑人| 欧美一级色视频美日韩| 女生被男生插的视频网站| 亚洲午夜精品小视频| 日本在线不卡免费视频| aⅴ五十路av熟女中出| 久久久久久9999久久久久| 国产精品大陆在线2019不卡| 午夜激情精品福利视频| 国产精品国产精品一区二区| 久久久久久久久久久久久97| 欧美一区二区三区在线资源| 天天干天天操天天爽天天摸| 亚洲精品中文字幕下载| 自拍偷区二区三区麻豆| 丝袜长腿第一页在线| 国产超码片内射在线| 果冻传媒av一区二区三区| 91超碰青青中文字幕| 男人的天堂在线黄色| 天堂中文字幕翔田av| 中文字幕 人妻精品| 亚洲综合另类精品小说| 亚洲美女美妇久久字幕组| 2021国产一区二区| 搡老熟女一区二区在线观看| 午夜精品九一唐人麻豆嫩草成人| 动漫美女的小穴视频| 男大肉棒猛烈插女免费视频| 任你操任你干精品在线视频| 青青青爽视频在线播放| 精品人妻每日一部精品| 肏插流水妹子在线乐播下载| 国产视频一区在线观看| 熟女人妻一区二区精品视频| 青青草人人妻人人妻| 最新日韩av传媒在线| 国产精品大陆在线2019不卡| 在线观看免费av网址大全| 一区二区视频在线观看视频在线| 日韩在线中文字幕色| 午夜婷婷在线观看视频| 亚洲高清国产一区二区三区| 亚洲超碰97人人做人人爱| 青青青青草手机在线视频免费看| 亚洲高清国产拍青青草原| 日本精品一区二区三区在线视频。| 日本熟妇色熟妇在线观看| av亚洲中文天堂字幕网| av成人在线观看一区| 中文字幕午夜免费福利视频| 久久艹在线观看视频| 亚洲图片欧美校园春色| 亚洲av日韩高清hd| 超鹏97历史在线观看| 中文字幕无码一区二区免费 | 欧美另类重口味极品在线观看| 成人免费毛片aaaa| av森泽佳奈在线观看| 曰本无码人妻丰满熟妇啪啪| 阴茎插到阴道里面的视频| 国产成人自拍视频在线免费观看| 日本18禁久久久久久| 2020久久躁狠狠躁夜夜躁| 欧美一区二区三区激情啪啪啪| 日韩特级黄片高清在线看| 在线可以看的视频你懂的| 婷婷综合亚洲爱久久| 真实国模和老外性视频| 久久99久久99精品影院| 午夜成午夜成年片在线观看 | 人妻最新视频在线免费观看| 国产熟妇人妻ⅹxxxx麻豆| 亚洲偷自拍高清视频| 亚洲人妻av毛片在线| 亚洲高清国产自产av| 在线免费视频 自拍| 天天干天天操天天爽天天摸| 亚洲一级av大片免费观看| 国产日韩精品电影7777| 青青青视频自偷自拍38碰| 国产精品黄片免费在线观看| 中文字幕高清免费在线人妻| 搡老妇人老女人老熟女| 天天干天天爱天天色| 任我爽精品视频在线播放| 久精品人妻一区二区三区| 极品丝袜一区二区三区| 天天日天天敢天天干| 精品亚洲在线免费观看| 熟女人妻三十路四十路人妻斩| 免费av岛国天堂网站| 国产精品欧美日韩区二区| 亚洲的电影一区二区三区| 男人天堂av天天操| 国产麻豆乱子伦午夜视频观看| 免费观看丰满少妇做受| 97欧洲一区二区精品免费| 超级av免费观看一区二区三区| 欧美成人精品在线观看| 国产视频网站国产视频| 夜夜嗨av蜜臀av| 中文亚洲欧美日韩无线码| 久久这里有免费精品| 天天日天天干天天要| 国产夫妻视频在线观看免费| 精品乱子伦一区二区三区免费播| 欧美日韩激情啪啪啪| 国产揄拍高清国内精品对白| wwwxxx一级黄色片| 亚洲国产免费av一区二区三区| 欧美日韩一级黄片免费观看| 激情内射在线免费观看| 亚洲国产精品免费在线观看| 天天操夜夜骑日日摸| 免费手机黄页网址大全| 中文字幕日韩91人妻在线| 欧洲亚洲欧美日韩综合| 国内资源最丰富的网站| 激情小视频国产在线| 啊用力插好舒服视频| 亚洲嫩模一区二区三区| 91在线免费观看成人| 人妻最新视频在线免费观看| 午夜精品亚洲精品五月色| 91色网站免费在线观看| 大屁股熟女一区二区三区| 18禁污污污app下载| 欧美少妇性一区二区三区| 中出中文字幕在线观看| 欧美在线偷拍视频免费看| av在线资源中文字幕| weyvv5国产成人精品的视频| av在线shipin| 97人妻色免费视频| 中文字幕网站你懂的| 人妻最新视频在线免费观看| 亚洲区欧美区另类最新章节| 三级等保密码要求条款| 一区二区三区四区视频| 亚洲1区2区3区精华液| 日韩av有码一区二区三区4| 91免费观看在线网站| 国产大学生援交正在播放| 最新91精品视频在线| 中文字幕AV在线免费看 | 国产黄色片蝌蚪九色91| 日韩精品二区一区久久| 亚洲av自拍偷拍综合| 91成人精品亚洲国产| 天天操,天天干,天天射| 老司机免费福利视频网| 国产使劲操在线播放| 经典av尤物一区二区| 一区二区视频在线观看视频在线| 粉嫩av蜜乳av蜜臀| 亚洲精品国产在线电影| 日韩精品电影亚洲一区| 国产妇女自拍区在线观看| 99精品视频之69精品视频| 国产精品国色综合久久| 2018最新中文字幕在线观看| 大鸡八强奸视频在线观看| 男女啪啪视频免费在线观看| 在线观看免费岛国av| AV无码一区二区三区不卡| www天堂在线久久| av老司机亚洲一区二区| asmr福利视频在线观看| 中文字幕一区的人妻欧美日韩| 国产亚洲欧美45p| 亚洲成人三级在线播放 | 欧美精品久久久久久影院| 一区二区三区的久久的蜜桃的视频 | 夜女神免费福利视频| huangse网站在线观看| 午夜精品福利91av| 日本性感美女三级视频| 亚洲另类伦春色综合小| 在线观看成人国产电影| 午夜精品福利一区二区三区p| 国产精品久久久久久久女人18| 国产白袜脚足J棉袜在线观看| 啊啊好大好爽啊啊操我啊啊视频| 日韩一个色综合导航| 在线观看免费岛国av| gay gay男男瑟瑟在线网站| 操日韩美女视频在线免费看| 午夜场射精嗯嗯啊啊视频| 大胸性感美女羞爽操逼毛片| 国产中文字幕四区在线观看| 美女av色播在线播放| 不卡精品视频在线观看| 久草电影免费在线观看| 亚洲精品国产久久久久久| 成人av免费不卡在线观看| jiuse91九色视频| 亚洲成人精品女人久久久| 男人靠女人的逼视频| 亚洲天堂第一页中文字幕| 国产之丝袜脚在线一区二区三区| 中文字幕无码日韩专区免费| 国产卡一卡二卡三乱码手机| wwwxxx一级黄色片| 久久久久久久精品成人热| 亚洲va国产va欧美精品88| 中文字幕av第1页中文字幕| 天天日天天日天天射天天干| 免费大片在线观看视频网站| 国产妇女自拍区在线观看| 92福利视频午夜1000看| 日本在线一区二区不卡视频| av一区二区三区人妻| 国产乱子伦精品视频潮优女| 蜜桃专区一区二区在线观看| www日韩a级s片av| 日韩无码国产精品强奸乱伦| av日韩在线观看大全| 国产精品人妻熟女毛片av久| 免费黄色成人午夜在线网站| 日本又色又爽又黄又粗| 国产成人自拍视频在线免费观看| 久草视频在线一区二区三区资源站 | jiujiure精品视频在线| 黄色视频成年人免费观看| 香蕉av影视在线观看| 久久美欧人妻少妇一区二区三区| 国产精品手机在线看片| 黑人巨大精品欧美视频| 五十路在线观看完整版| 中文字幕一区的人妻欧美日韩| 爆乳骚货内射骚货内射在线 | 日韩激情文学在线视频| 日本精品一区二区三区在线视频。 | 亚洲狠狠婷婷综合久久app| av中文字幕网址在线| 老司机免费视频网站在线看| 国产精品视频一区在线播放| 十八禁在线观看地址免费| 一区二区三区蜜臀在线| 成人伊人精品色xxxx视频| 国产精品手机在线看片| 国产乱子伦一二三区| 久久久久久97三级| 18禁美女羞羞免费网站| 都市激情校园春色狠狠| 色综合天天综合网国产成人| 国产自拍在线观看成人| 欧美麻豆av在线播放| 亚洲 色图 偷拍 欧美| 国产亚洲四十路五十路| 国产精品人妻一区二区三区网站| 欧美另类z0z变态| 精彩视频99免费在线| 中文字幕在线视频一区二区三区 | 欧美精产国品一二三区| sw137 中文字幕 在线| 日韩欧美高清免费在线| 色花堂在线av中文字幕九九| 日本高清成人一区二区三区| 青娱乐最新视频在线| 天天操天天爽天天干| 国产精选一区在线播放| 亚洲精品麻豆免费在线观看 | 国产在线自在拍91国语自产精品 | 在线免费观看黄页视频| 天堂av在线最新版在线| 天堂av在线播放免费| 精品视频中文字幕在线播放| 1区2区3区不卡视频| 18禁美女无遮挡免费| 国产性感美女福利视频| 五十路熟女人妻一区二| 免费看高清av的网站| 91精品国产91久久自产久强| 超碰97人人澡人人| 姐姐的朋友2在线观看中文字幕 | 日本韩国在线观看一区二区| 大鸡吧插逼逼视频免费看| 97人人模人人爽人人喊| 日本特级片中文字幕| 任我爽精品视频在线播放| 亚洲av无硬久久精品蜜桃| 日本成人一区二区不卡免费在线| 9色精品视频在线观看| 亚洲第17页国产精品| 日本五十路熟新垣里子| 99热这里只有精品中文| 免费一级特黄特色大片在线观看| 欧美日本国产自视大全| 国产高清精品一区二区三区| 日日夜夜精品一二三| 黑人巨大精品欧美视频| 欧美黑人与人妻精品| 瑟瑟视频在线观看免费视频| 日韩少妇人妻精品无码专区| 中文字幕日韩人妻在线三区| 丝袜国产专区在线观看| 中国视频一区二区三区| 性生活第二下硬不起来| 青青青国产片免费观看视频| 久草视频 久草视频2| 中文字幕在线观看国产片| 亚洲成人黄色一区二区三区| 好了av中文字幕在线| 99精品国产免费久久| 92福利视频午夜1000看| 亚洲国产最大av综合| 青草亚洲视频在线观看| 美女av色播在线播放| 91中文字幕最新合集| 成人av免费不卡在线观看| 九色porny九色9l自拍视频| 97精品视频在线观看| 55夜色66夜色国产精品站| 青青色国产视频在线| 在线观看日韩激情视频| 99热99re在线播放| japanese日本熟妇另类| 亚洲国产在人线放午夜| 成年美女黄网站18禁久久| 免费黄页网站4188| 亚洲乱码中文字幕在线| 日韩精品中文字幕福利| 亚洲女人的天堂av| 91一区精品在线观看| 一区二区三区 自拍偷拍| 日韩美女搞黄视频免费| 五月精品丁香久久久久福利社| 美洲精品一二三产区区别| 亚洲 人妻 激情 中文| 欧美视频中文一区二区三区| 亚洲图库另类图片区| 把腿张开让我插进去视频| 久久尻中国美女视频| 天天操夜夜操天天操天天操| 78色精品一区二区三区| 91国内精品自线在拍白富美| av完全免费在线观看av| 538精品在线观看视频| 中文字幕一区二区亚洲一区| 亚洲日本一区二区三区 | 91麻豆精品秘密入口在线观看| 2017亚洲男人天堂| 亚洲高清国产拍青青草原| 亚洲一级 片内射视正片| 亚洲福利午夜久久久精品电影网| 男人天堂色男人av| 99热久久这里只有精品8| 国产之丝袜脚在线一区二区三区| 国产在线免费观看成人| 大香蕉伊人国产在线| 新97超碰在线观看| 日韩不卡中文在线视频网站| 欧美成人精品在线观看| 精品首页在线观看视频| 干逼又爽又黄又免费的视频| 欧美日韩激情啪啪啪| 38av一区二区三区| 精品一区二区三区午夜| 成人30分钟免费视频| 天天干狠狠干天天操| 国产露脸对白在线观看| 中文字幕—97超碰网| 91‖亚洲‖国产熟女| 操的小逼流水的文章| 换爱交换乱高清大片| 天天干天天操天天玩天天射| 日本又色又爽又黄又粗| 午夜场射精嗯嗯啊啊视频| avjpm亚洲伊人久久| 欧美成一区二区三区四区| 国产精品视频男人的天堂| 黄片三级三级三级在线观看| 人妻丝袜榨强中文字幕| 在线播放一区二区三区Av无码| 欧美日韩人妻久久精品高清国产| 成人性爱在线看四区| 欧美亚洲自偷自拍 在线| 国语对白xxxx乱大交| 综合国产成人在线观看| 国产九色91在线视频| 一区二区三区日韩久久| 国产密臀av一区二区三| 欧洲亚洲欧美日韩综合| 亚洲av日韩精品久久久久久hd| 动漫av网站18禁| 天堂资源网av中文字幕| 偷拍自拍福利视频在线观看| 国产在线拍揄自揄视频网站| 男生舔女生逼逼的视频| 在线视频自拍第三页| 91av中文视频在线| 色婷婷综合激情五月免费观看| 日本少妇精品免费视频| 在线制服丝袜中文字幕| 天天操天天干天天日狠狠插| 少妇人妻100系列| 国产精品视频一区在线播放| 中文字幕—97超碰网| 日韩欧美一级黄片亚洲| 欧美怡红院视频在线观看| 91超碰青青中文字幕| 人妻少妇性色欲欧美日韩| 偷拍自拍亚洲视频在线观看| 久久精品国产亚洲精品166m| av成人在线观看一区| 北条麻妃肉色丝袜视频| 亚洲精品无码色午夜福利理论片| 丝袜肉丝一区二区三区四区在线看| 亚洲美女美妇久久字幕组| 成人24小时免费视频| 香蕉片在线观看av| 日本精品一区二区三区在线视频。 | 9久在线视频只有精品| eeuss鲁片一区二区三区| 特一级特级黄色网片| 国产视频精品资源网站| 97资源人妻免费在线视频| 国产 在线 免费 精品| 国产成人精品亚洲男人的天堂| 2020久久躁狠狠躁夜夜躁 | 日韩精品中文字幕播放| 日本黄色特一级视频| 顶级尤物粉嫩小尤物网站| av成人在线观看一区| 亚洲av第国产精品| 精品视频国产在线观看| 久久精品国产999| 日韩熟女av天堂系列| 欧美性感尤物人妻在线免费看| 中文字幕日韩人妻在线三区| 日韩成人综艺在线播放| 欧美激情精品在线观看| 91精品国产高清自在线看香蕉网 | 国产片免费观看在线观看| 国产大鸡巴大鸡巴操小骚逼小骚逼| 国产一级麻豆精品免费| 国产成人精品av网站| 大陆胖女人与丈夫操b国语高清| 可以在线观看的av中文字幕| 国产黄色高清资源在线免费观看| brazzers欧熟精品系列| 动色av一区二区三区| 日韩美女精品视频在线观看网站 | 欧美viboss性丰满| 天天综合天天综合天天网| 蜜臀av久久久久久久| 换爱交换乱高清大片| 超碰97人人做人人爱| 免费在线看的黄网站| 麻豆精品成人免费视频| 成人免费做爰高潮视频| 婷婷色中文亚洲网68| 人妻少妇精品久久久久久| 精品一区二区三区在线观看| 在线观看操大逼视频| 久草视频在线免播放| 51精品视频免费在线观看| 91国偷自产一区二区三区精品| 日韩写真福利视频在线观看| 人妻丝袜诱惑我操她视频| 老师让我插进去69AV| 男人操女人的逼免费视频| 99热久久这里只有精品8| 久草视频福利在线首页| 2021久久免费视频| 国产精品黄片免费在线观看| 91天堂天天日天天操| 精品高跟鞋丝袜一区二区| 97人妻无码AV碰碰视频| 大胆亚洲av日韩av| av中文字幕电影在线看| 自拍偷拍一区二区三区图片 | 狠狠地躁夜夜躁日日躁| 国产福利小视频大全| 精品成人啪啪18免费蜜臀| 天天操天天插天天色| 污污小视频91在线观看| 不戴胸罩引我诱的隔壁的人妻| 亚洲成人熟妇一区二区三区| 大鸡巴操b视频在线| 亚洲 欧美 自拍 偷拍 在线| 青青尤物在线观看视频网站| 337p日本大胆欧美人| 免费黄页网站4188| 天天操夜夜骑日日摸| 天天日天天添天天爽| 成熟丰满熟妇高潮xx×xx| 91人妻人人做人人爽在线| 91高清成人在线视频| 99精品久久久久久久91蜜桃| 欧美精品激情在线最新观看视频| 2022国产精品视频| 熟女在线视频一区二区三区| 黄色男人的天堂视频| 制丝袜业一区二区三区| 亚洲va欧美va人人爽3p| 精品人妻一二三区久久| 熟女人妻在线中出观看完整版| 97年大学生大白天操逼| 天天躁日日躁狠狠躁躁欧美av| 中文字幕人妻一区二区视频 | 亚洲视频乱码在线观看| 天天日天天天天天天天天天天 | 在线制服丝袜中文字幕| 欧美亚洲免费视频观看| 538精品在线观看视频| 欧美韩国日本国产亚洲| 麻豆性色视频在线观看| 一区二区视频视频视频| 美女av色播在线播放| 成人24小时免费视频| 91精品国产黑色丝袜| 欧美aa一级一区三区四区| 亚洲国产美女一区二区三区软件 | 日韩熟女系列一区二区三区| 亚洲 欧美 自拍 偷拍 在线| 老司机福利精品免费视频一区二区| 只有精品亚洲视频在线观看| 超碰97人人澡人人| 国产欧美日韩在线观看不卡| 日本啪啪啪啪啪啪啪| 免费费一级特黄真人片| 国产精品视频欧美一区二区 | 色吉吉影音天天干天天操| 黄片大全在线观看观看| 11久久久久久久久久久| 国产熟妇一区二区三区av| 精品久久婷婷免费视频| 午夜成午夜成年片在线观看| 国产亚洲四十路五十路| 经典av尤物一区二区| 男人在床上插女人视频| 国产在线免费观看成人| 中文字幕一区二区三区蜜月 | 日韩av大胆在线观看| 久久农村老妇乱69系列| 婷婷色中文亚洲网68| 日韩美女福利视频网| 超级福利视频在线观看| 免费av岛国天堂网站| 大鸡巴插入美女黑黑的阴毛| 欧美男人大鸡吧插女人视频| av久久精品北条麻妃av观看| 一二三中文乱码亚洲乱码one| 亚洲视频在线观看高清| 中国黄色av一级片| 亚洲熟妇x久久av久久| 硬鸡巴动态操女人逼视频| 九一传媒制片厂视频在线免费观看| 国产欧美精品免费观看视频| 亚洲欧美日韩视频免费观看| 在线国产精品一区二区三区| 亚洲熟妇无码一区二区三区| 在线新三级黄伊人网| 人妻少妇av在线观看| 黄色黄色黄片78在线| 日本男女操逼视频免费看| 美女张开腿让男生操在线看| 国产综合高清在线观看| 大鸡吧插入女阴道黄色片| 天天操天天干天天插| 大鸡吧插入女阴道黄色片| AV无码一区二区三区不卡| 成人精品在线观看视频| av在线观看网址av| 懂色av蜜桃a v| 欧美va不卡视频在线观看| 国产精品国色综合久久| 啪啪啪18禁一区二区三区| 一区二区三区视频,福利一区二区| 久久www免费人成一看片| 少妇人妻真实精品视频| 国产成人一区二区三区电影网站 | 亚洲午夜伦理视频在线| 欧美偷拍亚洲一区二区| 精彩视频99免费在线| 日本av在线一区二区三区| 日本韩国免费一区二区三区视频 | 色婷婷综合激情五月免费观看| 2022天天干天天操| 久精品人妻一区二区三区| 99精品免费久久久久久久久a| 久久精品久久精品亚洲人| 精品高潮呻吟久久av| 午夜美女福利小视频| 久久精品国产999| 国产视频网站一区二区三区| 婷婷色中文亚洲网68| 国产又粗又硬又猛的毛片视频 | 综合一区二区三区蜜臀| 91精品啪在线免费| 69精品视频一区二区在线观看| 日本一二三区不卡无| 欧美香蕉人妻精品一区二区| 97超碰免费在线视频| 亚洲午夜精品小视频| 日韩美女精品视频在线观看网站| 啊慢点鸡巴太大了啊舒服视频| sspd152中文字幕在线| 国产精品3p和黑人大战| 欧美一区二区中文字幕电影| 午夜久久久久久久精品熟女| 日本啪啪啪啪啪啪啪| 男人的天堂一区二区在线观看| 91成人在线观看免费视频| 97精品综合久久在线| 黄色黄色黄片78在线| 天天干天天日天天干天天操| 国产一区二区三免费视频| 激情五月婷婷免费视频| 福利视频广场一区二区| 国产精品伦理片一区二区| 亚洲午夜电影之麻豆| 在线观看视频 你懂的| 日本一二三区不卡无| 98视频精品在线观看| 欧美美女人体视频一区| 亚洲精品午夜久久久久| 十八禁在线观看地址免费| 中文字幕熟女人妻久久久| 天天做天天干天天操天天射| 免费观看污视频网站| 人妻少妇亚洲精品中文字幕| 天天日天天天天天天天天天天| 这里只有精品双飞在线播放| 岛国黄色大片在线观看| 在线免费91激情四射 | 成人激情文学网人妻| 男人天堂av天天操| 欧美亚洲免费视频观看| 国产内射中出在线观看| 精品欧美一区二区vr在线观看| 日韩一个色综合导航| 国产精品3p和黑人大战| av天堂中文字幕最新| 成年人午夜黄片视频资源| 国产亚洲精品欧洲在线观看| 嫩草aⅴ一区二区三区| 久久艹在线观看视频| 老熟妇凹凸淫老妇女av在线观看| 亚洲精品无码久久久久不卡| 一区二区三区激情在线| 日韩欧美亚洲熟女人妻| 亚洲成人三级在线播放 | 在线免费观看国产精品黄色| 日本裸体熟妇区二区欧美| 成人av久久精品一区二区| 狠狠的往里顶撞h百合| 亚洲精品国偷自产在线观看蜜桃| 日本一区二区三区免费小视频| 夜夜操,天天操,狠狠操| av一区二区三区人妻| 伊人情人综合成人久久网小说 | 日韩北条麻妃一区在线| 亚洲国产欧美一区二区丝袜黑人| 日韩精品一区二区三区在线播放| 国产精品一区二区久久久av| 亚洲天堂第一页中文字幕| 国产剧情演绎系列丝袜高跟| 91福利在线视频免费观看| 亚洲av天堂在线播放| 青青草原网站在线观看| 国产普通话插插视频| 3344免费偷拍视频| 国产妇女自拍区在线观看| 日本少妇精品免费视频| 欧美视频中文一区二区三区| 国产精品探花熟女在线观看| 成人综合亚洲欧美一区| 亚洲精品精品国产综合| 天堂av中文在线最新版| 少妇一区二区三区久久久| 中文字幕av一区在线观看| 亚洲熟妇久久无码精品| 亚洲人成精品久久久久久久| 午夜久久久久久久精品熟女| 好吊视频—区二区三区| 好太好爽好想要免费| 18禁精品网站久久| 成人在线欧美日韩国产| 97超碰免费在线视频| 国产日韩欧美美利坚蜜臀懂色| 亚洲午夜在线视频福利| 中文字幕午夜免费福利视频| 亚国产成人精品久久久| 性生活第二下硬不起来| 影音先锋女人av噜噜色| 亚洲 中文字幕在线 日韩| 91片黄在线观看喷潮| 亚洲成人免费看电影| 国产成人精品av网站| 欧美在线精品一区二区三区视频 | 午夜大尺度无码福利视频| 日韩特级黄片高清在线看| 国产成人自拍视频播放| 午夜精品在线视频一区| 午夜激情久久不卡一区二区 | 97国产在线av精品| 久草视频在线免播放| 人妻丝袜榨强中文字幕| 最近中文2019年在线看| a v欧美一区=区三区| 在线免费观看av日韩| 国产日韩精品电影7777| 性色av一区二区三区久久久| 日韩午夜福利精品试看| 换爱交换乱高清大片| 亚洲免费福利一区二区三区| 久草视频在线看免费| 欧美专区日韩专区国产专区| 天天干天天操天天玩天天射| 99精品免费观看视频| 色天天天天射天天舔| 啊啊好慢点插舔我逼啊啊啊视频| 日韩成人免费电影二区| 视频一区二区三区高清在线| 国产露脸对白在线观看| 91天堂精品一区二区| 国产亚洲精品视频合集| 任你操任你干精品在线视频| 日韩av免费观看一区| 黑人性生活视频免费看| 日本韩国亚洲综合日韩欧美国产| 午夜美女少妇福利视频| 亚洲va国产va欧美va在线| 日本乱人一区二区三区| yy96视频在线观看| 激情人妻校园春色亚洲欧美| 青草青永久在线视频18| 日韩欧美亚洲熟女人妻| 美洲精品一二三产区区别| 99热国产精品666| 亚洲熟妇x久久av久久| 成人av久久精品一区二区| 欧美怡红院视频在线观看| 2012中文字幕在线高清| av线天堂在线观看| 99热久久这里只有精品8| 青青青青青手机视频| 狠狠嗨日韩综合久久| 欧美精品国产综合久久| 大肉大捧一进一出好爽在线视频| yy96视频在线观看| 天堂av中文在线最新版| 含骚鸡巴玩逼逼视频| 日本一本午夜在线播放| 亚洲国产精品中文字幕网站| 人妻3p真实偷拍一二区| 98精产国品一二三产区区别| 特大黑人巨大xxxx| 91精品国产黑色丝袜| 粗大的内捧猛烈进出爽大牛汉子| 日辽宁老肥女在线观看视频| 中文字幕网站你懂的| 伊人日日日草夜夜草| 亚洲精品国品乱码久久久久| 91麻豆精品传媒国产黄色片| 爱爱免费在线观看视频| 91精品高清一区二区三区| 成人国产小视频在线观看| 99久久超碰人妻国产| 色伦色伦777国产精品| 欧美亚洲牲夜夜综合久久| 天天干天天日天天谢综合156| 天堂av中文在线最新版| 又粗又硬又猛又黄免费30| 日本高清在线不卡一区二区| 超碰97人人澡人人| 人妻丝袜av在线播放网址| 阿v天堂2014 一区亚洲| 成人午夜电影在线观看 久久| 日韩激情文学在线视频| 国产普通话插插视频| 偷青青国产精品青青在线观看| 中文字幕日韩91人妻在线| 黄色片年轻人在线观看| 中国黄片视频一区91| 中文字幕成人日韩欧美| 欧美日韩激情啪啪啪| av老司机亚洲一区二区| 人人妻人人爱人人草| 91精品视频在线观看免费| 天天做天天爽夜夜做少妇| 亚洲1069综合男同| 午夜精品亚洲精品五月色| 久久丁香花五月天色婷婷| 老司机99精品视频在线观看| 色97视频在线播放| 欧美美女人体视频一区| 少妇ww搡性bbb91| 亚洲av日韩高清hd| 精品suv一区二区69| 中英文字幕av一区| 美女张开两腿让男人桶av| 51国产成人精品视频| 3D动漫精品啪啪一区二区下载| av森泽佳奈在线观看| 中文字幕一区二区三区蜜月| 亚洲图库另类图片区| 亚洲国产最大av综合| 国产janese在线播放| 黄色三级网站免费下载| 精品高潮呻吟久久av| av中文字幕在线导航| yellow在线播放av啊啊啊| 88成人免费av网站| 18禁免费av网站| 老司机午夜精品视频资源| 2018最新中文字幕在线观看| 天天日天天摸天天爱| 亚洲人妻30pwc| 亚洲欧美另类手机在线| 亚洲福利精品视频在线免费观看| 日本免费视频午夜福利视频| 一二三中文乱码亚洲乱码one | 在线免费视频 自拍| 丰满的子国产在线观看| 含骚鸡巴玩逼逼视频| 可以在线观看的av中文字幕| 97人妻色免费视频| 99精品国产免费久久| 综合激情网激情五月天| 中文字幕日本人妻中出| 国产福利小视频大全| 欧美地区一二三专区| 亚洲精品乱码久久久久久密桃明| 自拍偷拍,中文字幕| 久久久久久97三级| 国产一区二区三免费视频 | 老司机福利精品免费视频一区二区| 最新国产亚洲精品中文在线| 国产一区二区欧美三区| 亚洲乱码中文字幕在线| 日韩视频一区二区免费观看| 操日韩美女视频在线免费看| 免费看国产又粗又猛又爽又黄视频| av天堂资源最新版在线看| 免费一级黄色av网站| 亚洲高清视频在线不卡| 骚逼被大屌狂草视频免费看| 欧美另类z0z变态| 欧美日韩一级黄片免费观看| 91久久国产成人免费网站| 国产亚洲成人免费在线观看 | 黄色在线观看免费观看在线| 91九色porny国产蝌蚪视频| 真实国模和老外性视频| 美味人妻2在线播放| 国产露脸对白在线观看| 日韩成人免费电影二区| 日本裸体熟妇区二区欧美| 亚洲中文精品人人免费| 黄色在线观看免费观看在线| 亚洲av无硬久久精品蜜桃| 91麻豆精品91久久久久同性| 欧美黄片精彩在线免费观看| 在线 中文字幕 一区| 精品国产高潮中文字幕| 国产黄色片蝌蚪九色91| 欧美一级色视频美日韩| 任你操视频免费在线观看| 男人操女人逼逼视频网站| 阴茎插到阴道里面的视频| 日本丰满熟妇BBXBBXHD| 亚洲精品亚洲人成在线导航| 成熟熟女国产精品一区| 国产综合精品久久久久蜜臀| 欧美一区二区三区高清不卡tv| 亚洲国产成人无码麻豆艾秋| 久久久久久性虐视频| 少妇深喉口爆吞精韩国| 初美沙希中文字幕在线| 端庄人妻堕落挣扎沉沦| av大全在线播放免费| 天天插天天狠天天操| 99久久激情婷婷综合五月天| 偷青青国产精品青青在线观看| 清纯美女在线观看国产| 欧美日韩中文字幕欧美| 97精品视频在线观看| 无码国产精品一区二区高潮久久4| www日韩毛片av| 久久精品国产亚洲精品166m| 天天日天天爽天天爽|