<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                {% raw %} # MongoDB Java 教程 原文:http://zetcode.com/java/mongodb/ 在本教程中,我們將展示如何在 Java 中使用 MongoDB。 在 ZetCode 上有一個簡潔的 [Java 教程](/lang/java/)。 MongoDB 是 NoSQL 跨平臺的面向文檔的數據庫。 它是可用的最受歡迎的數據庫之一。 MongoDB 由 MongoDB Inc. 開發,并作為免費和開源軟件發布。 MongoDB 中的記錄是一個文檔,它是由字段和值對組成的數據結構。 MongoDB 文檔與 JSON 對象相似。 字段的值可以包括其他文檔,數組和文檔數組。 MongoDB 將文檔存儲在集合中。 集合類似于關系數據庫中的表以及行中的文檔。 ## 安裝 MongoDB 以下命令可用于在基于 Debian 的 Linux 上安裝 MongoDB。 ```java $ sudo apt-get install mongodb ``` 該命令將安裝 MongoDB 隨附的必要包。 ```java $ sudo service mongodb status mongodb start/running, process 975 ``` 使用`sudo service mongodb status`命令,我們檢查`mongodb`服務器的狀態。 ```java $ sudo service mongodb start mongodb start/running, process 6448 ``` `mongodb`服務器由`sudo service mongodb start`命令啟動。 ## 建立數據庫 `mongo`工具是 MongoDB 的交互式 JavaScript Shell 界面,它為系統管理員提供了一個界面,并為開發者提供了一種直接測試數據庫查詢和操作的方法。 ```java $ mongo testdb MongoDB shell version v4.0.7 connecting to: mongodb://127.0.0.1:27017/testdb?gssapiServiceName=mongodb ... > db testdb > db.cars.insert({name: "Audi", price: 52642}) > db.cars.insert({name: "Mercedes", price: 57127}) > db.cars.insert({name: "Skoda", price: 9000}) > db.cars.insert({name: "Volvo", price: 29000}) > db.cars.insert({name: "Bentley", price: 350000}) > db.cars.insert({name: "Citroen", price: 21000}) > db.cars.insert({name: "Hummer", price: 41400}) > db.cars.insert({name: "Volkswagen", price: 21600}) ``` 我們創建一個`testdb`數據庫,并在`cars`集合中插入八個文檔。 ## Java MongoDB 驅動程序 我們使用以下 Maven 聲明在項目中包括 MongoDB Java 驅動程序。 ```java <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>x.y.z</version> </dependency> ``` 它是一個多功能的 JAR,它嵌入了核心驅動程序和 BSON。 BSON 是 Binaryary JSON 的縮寫,是類似于 JSON 的文檔的二進制編碼的序列化。 ## Java MongoDB 列出數據庫集合 第一個示例連接到`testdb`數據庫并檢索其集合。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>mongocommand</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.10.2</version> </dependency> </dependencies> </project> ``` 這是我們的`pom.xml`文件。 `com/zetcode/MongoListCollections.java` ```java package com.zetcode; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; import java.util.logging.Level; import java.util.logging.Logger; public class MongoListCollections { public static void main(String[] args) { Logger mongoLogger = Logger.getLogger("org.mongodb.driver"); mongoLogger.setLevel(Level.SEVERE); try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase database = mongoClient.getDatabase("testdb"); for (String name : database.listCollectionNames()) { System.out.println(name); } } } } ``` 該示例連接到`testdb`數據庫并檢索其所有集合。 ```java Logger mongoLogger = Logger.getLogger("org.mongodb.driver"); mongoLogger.setLevel(Level.SEVERE); ``` 我們為 MongoDB 設置日志記錄級別。 我們僅顯示嚴重錯誤消息。 ```java try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { ``` `MongoClient`類用于連接到 MongoDB 服務器。 它是通過`MongoClients.create()`方法調用創建的。 27017 是 MongoDB 服務器監聽的默認端口。 ```java MongoDatabase database = mongoClient.getDatabase("testdb"); ``` 使用`getDatabase()`方法,我們檢索了`testdb`數據庫。 ```java for (String name : database.listCollectionNames()) { System.out.println(name); } ``` `listCollectionNames()`方法在`testdb`數據庫中找到所有集合。 ```java cars cities ``` 在我們的數據庫中,我們有這兩個集合。 ## Java MongoDB 數據庫統計 下一個示例連接到`testdb`數據庫并獲取其統計信息。 `com/zetcode/MongoCommand.java` ```java package com.zetcode; import com.mongodb.client.MongoClients; import org.bson.Document; import java.util.Map; public class MongoCommand { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); var stats = database.runCommand(new Document("dbstats", 1)); for (Map.Entry<String, Object> set : stats.entrySet()) { System.out.format("%s: %s%n", set.getKey(), set.getValue()); } } } } ``` 該示例連接到`testdb`數據庫并執行`dbstats`命令。 它顯示了一些數據庫統計信息。 ```java var stats = database.runCommand(new Document("dbstats", 1)); ``` 使用`runCommand()`方法,執行`dbstats`命令。 該命令返回`Document`,它表示 MongoDB 文檔作為映射。 ```java for (Map.Entry<String, Object> set : stats.entrySet()) { System.out.format("%s: %s%n", set.getKey(), set.getValue()); } ``` 我們遍歷文檔的條目。 ```java db: testdb collections: 2 views: 0 objects: 9 avgObjSize: 48.111111111111114 dataSize: 433.0 storageSize: 57344.0 numExtents: 0 indexes: 2 indexSize: 57344.0 fsUsedSize: 1.4818904064E11 fsTotalSize: 2.547211264E11 ok: 1.0 ``` 這是一個示例輸出。 ## Java MongoDB 讀取數據 `MongoCollection`用于存儲從集合返回的 mongo 文檔。 `MongoCursor`是一個游標,用于遍歷數據庫查詢的結果。 確保在發生異常時將其關閉。 `com/zetcode/MongoReadAll.java` ```java package com.zetcode; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import org.bson.Document; import java.util.ArrayList; public class MongoReadAll { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("cars"); try (MongoCursor<Document> cur = collection.find().iterator()) { while (cur.hasNext()) { var doc = cur.next(); var cars = new ArrayList<>(doc.values()); System.out.printf("%s: %s%n", cars.get(1), cars.get(2)); } } } } } ``` 在示例中,我們遍歷`cars`集合的所有數據。 ```java MongoCollection<Document> collection = database.getCollection("cars"); ``` 我們使用`getCollection()`方法檢索`cars`集合。 ```java try (MongoCursor<Document> cur = collection.find().iterator()) { while (cur.hasNext()) { var doc = cur.next(); var cars = new ArrayList<>(doc.values()); System.out.printf("%s: %s%n", cars.get(1), cars.get(2)); } } ``` 我們遍歷集合的文檔。 `find()`方法查找集合中的所有文檔。 ```java Audi: 52642.0 Mercedes: 57127.0 Skoda: 9000.0 Volvo: 29000.0 Bentley: 350000.0 Citroen: 21000.0 Hummer: 41400.0 Volkswagen: 21600.0 ``` 這是示例的輸出。 ## Java MongoDB 查詢運算符 可以使用 MongoDB 查詢運算符(例如`$gt`,`$lt`或`$ne`)過濾數據。 可以在`BasicDBObject`類中指定查詢運算符。 `com/zetcode/MongoReadGreaterThan.java` ```java package com.zetcode; import com.mongodb.BasicDBObject; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.function.Consumer; public class MongoReadGreaterThan { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("cars"); var query = new BasicDBObject("price", new BasicDBObject("$gt", 30000)); collection.find(query).forEach((Consumer<Document>) doc -> System.out.println(doc.toJson())); } } } ``` 該示例打印汽車價格大于 30,000 的所有文檔。 ```java var query = new BasicDBObject("price", new BasicDBObject("$gt", 30000)); ``` 我們使用`$gt`查詢運算符。 ```java collection.find(query).forEach((Consumer<Document>) doc -> System.out.println(doc.toJson())); ``` `forEach()`方法是一種語法糖,可以避免應用代碼擔心不必手動關閉游標。 使用`toJson()`方法以 JSON 格式打印數據。 ```java {"_id": {"$oid": "5d4d13d6463315268eb7376b"}, "name": "Audi", "price": 52642.0} {"_id": {"$oid": "5d4d13f5463315268eb7376c"}, "name": "Mercedes", "price": 57127.0} {"_id": {"$oid": "5d4d140d463315268eb7376f"}, "name": "Bentley", "price": 350000.0} {"_id": {"$oid": "5d4d1415463315268eb73771"}, "name": "Hummer", "price": 41400.0} ``` 這是 JSON 格式的示例輸出。 僅包括價格超過 30,000 的汽車。 ## Java MongoDB 工廠過濾器查詢方法 Java MongoDB 驅動包含查詢過濾器的工廠方法。 `com/zetcode/MongoFilter.java` ```java package com.zetcode; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import java.util.ArrayList; import static com.mongodb.client.model.Filters.and; import static com.mongodb.client.model.Filters.gt; import static com.mongodb.client.model.Filters.lt; public class MongoFilter { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("cars"); FindIterable fit = collection.find(and(lt("price", 50000), gt("price", 20000))).sort(new Document("price", -1)); var docs = new ArrayList<Document>(); fit.into(docs); for (Document doc : docs) { System.out.println(doc); } } } } ``` 在示例中,我們檢索價格在 20,000 到 50,000 之間的汽車。 ```java FindIterable fit = collection.find(and(lt("price", 50000), gt("price", 20000))).sort(new Document("price", -1)); ``` `and()`,`gt()`和`lt()`是工廠過濾方法。 此外,數據使用`sort()`方法排序。 ```java Document{{_id=5d4d1415463315268eb73771, name=Hummer, price=41400.0}} Document{{_id=5d4d1408463315268eb7376e, name=Volvo, price=29000.0}} Document{{_id=5d4d1419463315268eb73772, name=Volkswagen, price=21600.0}} Document{{_id=5d4d1411463315268eb73770, name=Citroen, price=21000.0}} ``` This is the output of the example. ## Java MongoDB 投影 `Projections`類為所有 MongoDB 投影運算符提供了靜態工廠方法。 默認情況下,將投影每個文檔的所有字段。 我們可以使用`include`和`exclude()`方法來確定應將哪些字段投影到我們的輸出中。 `com/zetcode/MongoProjection.java` ```java package com.zetcode; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.ArrayList; import static com.mongodb.client.model.Projections.excludeId; public class MongoProjection { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("cars"); FindIterable it = collection.find().projection(excludeId()); var docs = new ArrayList<Document>(); it.into(docs); for (Document doc : docs) { System.out.println(doc); } } } } ``` 該示例從輸出中排除`_id`字段。 ```java FindIterable it = collection.find().projection(excludeId()); ``` `projection()`方法設置一個文檔,該文檔描述要為所有匹配的文檔返回的字段。 `excludeId()`是`exclude("_id")`的同義詞。 ```java Document{{name=Audi, price=52642.0}} Document{{name=Mercedes, price=57127.0}} Document{{name=Skoda, price=9000.0}} Document{{name=Volvo, price=29000.0}} Document{{name=Bentley, price=350000.0}} Document{{name=Citroen, price=21000.0}} Document{{name=Hummer, price=41400.0}} Document{{name=Volkswagen, price=21600.0}} ``` 這是示例的輸出。 ## Java MongoDB 限制數據輸出 `limit`查詢選項指定要返回的文檔數量,`skip()`選項指定某些文檔。 `com/zetcode/MongoSkipLimit.java` ```java package com.zetcode; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.function.Consumer; public class MongoSkipLimit { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("cars"); FindIterable<Document> fit = collection.find().skip(2).limit(5); fit.forEach((Consumer<Document>) System.out::println); } } } ``` 該示例從`testdb.cars`集合中讀取,跳過前兩個文檔,并將輸出限制為五個文檔。 ```java FindIterable<Document> fit = collection.find().skip(2).limit(5); ``` `FindIterable`的`skip()`方法跳過前兩個文檔,`limit()`方法將輸出限制為五個文檔。 ```java fit.forEach((Consumer<Document>) System.out::println); ``` 在這里,我們使用 Java8 構造來打印文檔。 ```java Document{{_id=5d4d13fb463315268eb7376d, name=Skoda, price=9000.0}} Document{{_id=5d4d1408463315268eb7376e, name=Volvo, price=29000.0}} Document{{_id=5d4d140d463315268eb7376f, name=Bentley, price=350000.0}} Document{{_id=5d4d1411463315268eb73770, name=Citroen, price=21000.0}} Document{{_id=5d4d1415463315268eb73771, name=Hummer, price=41400.0}} ``` This is the output of the example. ## Java MongoDB 創建集合 `MongoDatabase`的`createCollection()`方法在數據庫中創建一個新集合。 `MongoCollection`的`insertMany()`方法將一個或多個文檔插入到集合中。 `com/zetcode/MongoCreateCollection.java` ```java package com.zetcode; import com.mongodb.MongoCommandException; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.ArrayList; public class MongoCreateCollection { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); try { database.createCollection("cars"); } catch (MongoCommandException e) { database.getCollection("cars").drop(); } var docs = new ArrayList<Document>(); MongoCollection<Document> collection = database.getCollection("cars"); var d1 = new Document("_id", 1); d1.append("name", "Audi"); d1.append("price", 52642); docs.add(d1); var d2 = new Document("_id", 2); d2.append("name", "Mercedes"); d2.append("price", 57127); docs.add(d2); var d3 = new Document("_id", 3); d3.append("name", "Skoda"); d3.append("price", 9000); docs.add(d3); var d4 = new Document("_id", 4); d4.append("name", "Volvo"); d4.append("price", 29000); docs.add(d4); var d5 = new Document("_id", 5); d5.append("name", "Bentley"); d5.append("price", 350000); docs.add(d5); var d6 = new Document("_id", 6); d6.append("name", "Citroen"); d6.append("price", 21000); docs.add(d6); var d7 = new Document("_id", 7); d7.append("name", "Hummer"); d7.append("price", 41400); docs.add(d7); var d8 = new Document("_id", 8); d8.append("name", "Volkswagen"); d8.append("price", 21600); docs.add(d8); collection.insertMany(docs); } } } ``` 該示例創建一個`cars`集合并將 9 個文檔插入其中。 ```java try { database.createCollection("cars"); } catch (MongoCommandException e) { database.getCollection("cars").drop(); } ``` 使用`createCollection()`方法創建一個新集合。 如果該集合已經存在,則將其刪除。 ```java MongoCollection<Document> collection = database.getCollection("cars"); ``` 使用`getCollection()`方法創建文檔的`MongoCollection`。 ```java var d1 = new Document("_id", 1); d1.append("name", "Audi"); d1.append("price", 52642); docs.add(d1); ``` 創建一個新的`Document`。 它包含有關汽車的信息,包括其 ID,名稱和價格。 ```java collection.insertMany(docs); ``` 使用`insertMany()`方法將文檔寫入集合。 ## Java MongoDB 從 JSON 創建集合 `JSON`類具有用于解析 JSON 文檔的方法。 JSON (JavaScript 對象表示法)是一種輕量級的數據交換格式。 人類易于閱讀和書寫。 `com/zetcode/MongoCollectionFromJSON.java` ```java package com.zetcode; import com.mongodb.BasicDBObject; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import org.bson.Document; import org.bson.types.ObjectId; public class MongoCollectionFromJSON { public static void main(String[] args) { try (var mongoClient = MongoClients.create("mongodb://localhost:27017")) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("continents"); var africa = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'Africa'}"); var asia = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'Asia'}"); var europe = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'Europe'}"); var america = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'America'}"); var australia = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'Australia'}"); var antarctica = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'Antarctica'}"); collection.insertOne(new Document(africa)); collection.insertOne(new Document(asia)); collection.insertOne(new Document(europe)); collection.insertOne(new Document(america)); collection.insertOne(new Document(australia)); collection.insertOne(new Document(antarctica)); } } } ``` 該示例從 JSON 數據創建`continents`集合。 ```java var africa = BasicDBObject.parse("{_id : '" + ObjectId.get() + "', name : 'Africa'}"); ``` JSON 數據使用`BasicDBObject.parse`方法進行解析。 ```java collection.insertOne(new Document(africa)); ``` `BasicDBObject`傳遞到`Document`,并通過`insertOne()`方法插入到集合中。 ```java > db.continents.find() { "_id" : "5d4af89645ffb636567b6448", "name" : "Africa" } { "_id" : "5d4af89645ffb636567b6449", "name" : "Asia" } { "_id" : "5d4af89645ffb636567b644a", "name" : "Europe" } { "_id" : "5d4af89645ffb636567b644b", "name" : "America" } { "_id" : "5d4af89645ffb636567b644c", "name" : "Australia" } { "_id" : "5d4af89645ffb636567b644d", "name" : "Antarctica" } ``` 我們用`mongo`顯示創建的集合。 ## Java MongoDB 修改文件 `MongoCollection`的`deleteOne()`方法用于刪除文檔,`updateOne()`用于更新文檔。 `com/zetcode/MongoModify.java` ```java package com.zetcode; import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import org.bson.Document; import static com.mongodb.client.model.Filters.eq; public class MongoModify { public static void main(String[] args) { try (var mongoClient = new MongoClient("localhost", 27017)) { var database = mongoClient.getDatabase("testdb"); MongoCollection<Document> collection = database.getCollection("cars"); collection.deleteOne(eq("name", "Skoda")); collection.updateOne(new Document("name", "Audi"), new Document("$set", new Document("price", 52000))); } } } ``` 該示例刪除包含 Skoda 的文檔并更新 Audi 的價格。 ```java collection.deleteOne(eq("name", "Skoda")); ``` `deleteOne()`刪除`Skoda`的文檔。 `eq()`創建一個與所有文檔匹配的過濾器,其中字段名稱的值等于指定的值。 ```java collection.updateOne(new Document("name", "Audi"), new Document("$set", new Document("price", 52000))); ``` 通過`updateOne()`方法將 Audi 的價格更改為 52,000。 ```java > db.cars.find() { "_id" : ObjectId("5d4d13d6463315268eb7376b"), "name" : "Audi", "price" : 52000 } { "_id" : ObjectId("5d4d13f5463315268eb7376c"), "name" : "Mercedes", "price" : 57127 } { "_id" : ObjectId("5d4d1408463315268eb7376e"), "name" : "Volvo", "price" : 29000 } { "_id" : ObjectId("5d4d140d463315268eb7376f"), "name" : "Bentley", "price" : 350000 } { "_id" : ObjectId("5d4d1411463315268eb73770"), "name" : "Citroen", "price" : 21000 } { "_id" : ObjectId("5d4d1415463315268eb73771"), "name" : "Hummer", "price" : 41400 } { "_id" : ObjectId("5d4d1419463315268eb73772"), "name" : "Volkswagen", "price" : 21600 } ``` 我們使用`mongo`工具確認更改。 在本教程中,我們使用了 MongoDB 和 Java。 您可能也對 [Spring Boot MongoDB 教程](/springboot/mongodb/), [MySQL Java 教程](/db/mysqljava/)或 [PostgreSQL Java 教程](/java/postgresql/)感興趣。 列出[所有 Java 教程](/all/#java)。 {% endraw %}
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看