mongoose中的文档和查询有什么区别?

4
根据mongoose文档:
Mongoose模型提供了几个静态辅助函数用于CRUD操作。这些函数中的每一个都返回一个mongoose查询对象。
模型是从架构定义编译的高级构造函数。
Mongoose文档表示与存储在MongoDB中的文档一对一的映射。每个文档都是其模型的实例。
现在,模型上的所有静态CRUD函数都返回一个查询。然而,在文档部分的指南下,它说“当您使用像findOne()这样的模型函数从MongoDB加载文档时,您会得到一个Mongoose文档。”。
在某个地方,Model.findOne()返回一个查询对象,在不同的部分中返回一个文档...请有人帮忙解释一下。
2个回答

2

这是一个非常好的问题。 仅仅创建一个查询并不意味着从模型中加载文档。当您使用 findOne() 方法时,您只是创建了一个查询,它将返回 Query Object。当您执行此查询以从模型中加载文档时,在这种情况下返回的是一个 document Object。希望以下示例可以澄清这个概念,知道这不是执行查询的唯一方式。

第一部分是创建查询

    const query = myModel.findOne({ name })
    console.log(query.constructor.name) // Query
    console.log(query instanceof mongoose.Query) // True
    console.log(query instanceof mongoose.Document) // False

第二部分是执行它。
    query.then((document) => {
        console.log(document.constructor.name) // model
        console.log(document instanceof mongoose.Query) // False
        console.log(document instanceof mongoose.Document) // True
        response.json(document)
    }).catch((error) => {
        response.json(error)
    })

0

昨天我读了 @Aya Othman 的答案好几遍,只有在读了 Mongoose 文档几次后才明白。所以我想也许像我这样的新手需要一种稍微不同的解释。据我理解,我们知道 Mongoose 的 模型 有几个用于 CRUD 操作 的函数,比如 Model.find()Model.findById()Model.findByIdAndDelete() 等。例如,当调用 User.findById(userId) 函数时,如果没有使用关键字 await,它不会从数据库中获取用户并返回文档,而是返回一个查询。这个查询是一个对象。它有方法。现在,如果我们想要获取用户,我们可以调用查询的 exec() 方法。

const query = User.findById(userId)

// fetch only user's name and age
query.select("name age")

// execute query at a later time
// `await query.exec()` is equivalent to `await User.findById(userId)`
const user = await query.exec()
console.log(user instanceof mongoose.Document) // true

有关详细信息,我建议阅读查询文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接