MongoDB findOne方法详解:实用示例与最佳实践

这是文章《MongoDB findOne 示例》的第1部分(共1部分)。

内容片段: MongoDB的findOne()方法返回只满足输入条件的一个文档。如果输入条件匹配多个文档,该方法会按照自然排序只返回一个文档,这个自然排序反映了文档在数据库中的存储顺序。

MongoDB的findOne方法

MongoDB的findOne()语法是:db.collection.findOne(<criteria>, <projection>)

  • criteria – 指定查询的选择条件。
  • projection – 指定返回文档中要显示的字段列表。

有关MongoDB findOne的几个重要点:

  • 投影参数接受布尔值1或true(表示包含),0或false(表示排除)。如果未指定投影字段,将检索所有字段。
  • MongoDB的findOne()函数始终包含_id字段,即使在投影参数中没有明确指定,除非该字段被明确排除。
  • MongoDB的findOne()函数只返回一个文档而不是指针。

MongoDB的findOne方法 – 空的查询规范

这个操作从指定的集合中返回一个文档。例如,执行db.car.findOne()命令会输出:

{
    "_id" : 2,
    "name" : "Polo", 
    "color" : "White",
    "cno" : "H411", 
    "speed" : 45, 
    "mfdcountry" : "Japan"
}

从汽车集合中仅检索到一条记录。请注意,”Polo” 是首先插入到数据库中的文档。

MongoDB的findOne方法 – 查询规范

该MongoDB的findOne操作从指定的集合中返回第一个与输入的选择条件匹配的文档。例如:

> db.car.findOne(
... {
...     $or: [
...         {name: "Zen"},
...         {speed: {$gt: 60}}
...     ]
... }
... )

{
    "_id" : ObjectId("546cb92393f464ed49d620db"), 
    "name" : "Zen",
    "color" : "JetRed",
    "cno" : "H671",
    "speed" : 67, 
    "mfdcountry" : "Rome"
}

这个操作在汽车集合中搜索名为”Zen”的汽车或速度大于60的汽车,并检索满足所输入条件的第一个文档。

在MongoDB的findOne()方法中使用投影功能

投影参数也适用于MongoDB的findOne方法。让我们看一些使用投影的情况。

使用MongoDB的findOne函数指定要返回的字段

此操作将仅显示查询中指定的字段。例如:

> db.car.findOne(
... { },
... {name: 1, color: 1}
... )

{ "_id" : 2, "name" : "Polo", "color" : "White" }

以上代码展示了来自汽车集合的第一个文档,其中包含_id、name和color字段。

MongoDB的findOne – 返回除了被排除的字段之外的所有字段

本操作根据选择条件排除指定字段,以检索第一个文档。例如:

> db.car.findOne(
... { name: "Volkswagen" },
... {_id: 0, mfdcountry: 0, cno: 0 }
... )

{ "name" : "Volkswagen", "color" : "JetBlue", "speed" : 62 }

在Volkswagen车型中,排除了_id、mfdcountry和cno字段,并返回包含name、color和speed字段的文档。

MongoDB的findOne查询结果文档

由于该方法仅返回单个文档,光标方法在此操作中无法使用。为了打印文档中的各个字段值,我们可以使用以下代码:

> var car = db.car.findOne(); 
> if (car) {
...     var carName = car.name;
...     print(tojson(carName));
... }

"Polo"

这段代码只检索并打印了汽车的名字”Polo”。

MongoDB的findOne Java示例

以下是展示了可以使用MongoDB findOne()的不同选项的Java程序。文件名:MongoDBFindOne.java

package com.Olivia.mongodb;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

import java.net.UnknownHostException;

public class MongoDBFindOne {

    // 无条件检索第一个文档的方法
    public static void emptyFindOne() throws UnknownHostException {

        // 获取数据库的新连接,假设数据库正在运行
        MongoClient mongoClient = new MongoClient("localhost");

        // 使用test作为数据库,这里请使用您自己的数据库
        DB db = mongoClient.getDB("test");

        // 获取集合对象,这里使用car集合,请使用您自己的集合
        DBCollection coll = db.getCollection("car");

        // 调用findOne()方法
        DBObject doc = coll.findOne();

        // 打印结果文档
        System.out.println(doc);
    }

    // 根据选择条件检索文档的方法
    public static void querySpecification() throws UnknownHostException {
        // 每次获取连接不是必需的(可以全局只做一次)
        MongoClient mongoClient = new MongoClient("localhost");
        DB db = mongoClient.getDB("test");
        DBCollection coll = db.getCollection("car");

        // 通过创建新对象来基于名称和速度值筛选文档的查询
        DBObject query = new BasicDBObject("name", "Zen").append("speed",
                new BasicDBObject("$gt", 30));

        // 通过满足条件获取的结果文档
        DBObject d1 = coll.findOne(query);

        // 在控制台打印文档
        System.out.println(d1);
    }

    public static void projectionFields() throws UnknownHostException {

        MongoClient mongoClient = new MongoClient("localhost");
        DB db = mongoClient.getDB("test");
        DBCollection coll = db.getCollection("car");

        // 创建新的数据库对象
        BasicDBObject b1 = new BasicDBObject();

        // 在结果文档中只显示名称和颜色字段的条件
        BasicDBObject fields = new BasicDBObject("name", 1).append("color", 1);

        // 通过接受字段和对象条件来检索文档的方法
        DBObject d1 = coll.findOne(b1, fields);

        System.out.println(d1);

    }

    public static void excludeByfields() throws UnknownHostException {
        MongoClient m1 = new MongoClient("localhost");

        DB db = m1.getDB("test");
        DBCollection col = db.getCollection("car");

        // 汽车名称为volkswagen的筛选条件
        DBObject query = new BasicDBObject("name", "Volkswagen");

        // 排除mfdcountry、cno和id字段
        BasicDBObject fields = new BasicDBObject("mfdcountry", 0).append("cno",
                0).append("_id", 0);

        DBObject d1 = col.findOne(query, fields);
        System.out.println(d1);
    }

    public static void printDoc() throws UnknownHostException {
        MongoClient m1 = new MongoClient("localhost");
        DB db = m1.getDB("test");
        DBCollection col = db.getCollection("car");
        
        DBObject d1 = col.findOne();
        
        // 只打印汽车的名称
        System.out.println((d1.get("name")));
    }
    
    public static void main(String[] args) throws UnknownHostException {
        // 从main方法调用所有方法
        emptyFindOne();
        querySpecification();
        projectionFields();
        excludeByfields();
        printDoc();
    }

}

以上程序的输出是:

{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : { "$oid" : "546cb92393f464ed49d620db"} , "name" : "Zen" , "color" : "JetRed" , "cno" : "H671" , "speed" : 67 , "mfdcountry" : "Rome"}
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White"}
{ "name" : "Volkswagen" , "color" : "JetBlue" , "speed" : 62}
Polo

这就是关于MongoDB的findOne()方法的全部内容,我们将在后续的文章中介绍更多关于MongoDB的选项。参考资料:官方文档。

bannerAds