- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
看来 Mongoose 在内部做了一些非常时髦的事情。
var Foo = new mongoose.model('Foo', new mongoose.Schema({a: String, b: Number}));
var foo = new Foo({a: 'test'; b: 42});
var obj = {c: 1};
foo.goo = obj; // simple object assignment. obj should be
// passed by reference to foo.goo. recall goo
// is not defined in the Foo model schema
console.log(foo.goo === obj); // comparison directly after the assignment
// => false, doesn't behave like normal JS object
基本上,任何时候您尝试处理 Mongoose 模型的属性时都不是
a) 在模型的架构中定义或
b) 定义为相同类型(数组、obj、..)...模型的行为甚至不像普通的 Javascript 对象。
将 4 行切换到 foo._doc.goo = obj
使控制台输出 true
。
编辑:试图重现怪异
示例 1:
// Customer has a property 'name', but no property 'text'
// I do this because I need to transform my data slightly before sending it
// to client.
models.Customer.find({}, function(err, data) {
for (var i=0, len=data.length; i<len; ++i) {
data[i] = data[i]._doc; // if I don't do this, returned data
// has no 'text' property
data[i].text = data[i].name;
}
res.json({success: err, response:data});
});
最佳答案
也许我误解了你原来的问题,但现在看来你的问题的性质发生了变化,所以下面的信息不相关,但我要离开了。 :)
我测试了你的代码,它对我来说很好用。当您设置不属于架构的属性(或一些其他特殊属性)时,Mongoose 不会执行任何特殊代码。 JavaScript 目前不支持调用尚不存在的属性的代码(例如,Mongoose 不能妨碍 goo
属性的集合)。
所以,当你设置属性时:
foo.goo = { c: 1 };
Mongoose 没有参与。如果您的 console.log
不是您显示的代码,我可以看到它可能会错误地报告。
此外,当您 send
将结果作为 JSON 返回时,将调用 JSON.stringify
,这会在您的 Mongoose 模型上调用 toString
。发生这种情况时,Mongoose 仅使用架构上定义的属性。因此,默认情况下不会发回任何其他属性。您已更改 data
数组的性质,但直接指向 Mongoose 数据,因此它避免了该问题。
当您使用 Mongoose 设置属性 goo
时,会发生很多事情。 Mongoose 通过 Object.defineProperty
(一些 docs )创建属性 getter/setter。因此,当您设置 goo
属性(您已将其定义为 [String]
)时,会发生一些事情:
MongooseArray
)。在您提供的示例中,由于您没有传递数组,因此将创建它。toString
。因此,结果是文档现在包含一个数组,其中包含您传递的对象的 toString
版本。
如果您检查 goo
属性的内容,您会发现它现在是一个包含单个元素的数组,它是一个包含 [object Object]
的字符串>。如果您选择了更基本的类型或匹配目标属性存储类型,您会发现基本的相等性检查会起作用。
关于node.js - Mongoose : "_doc"怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18821212/
我的API版本是6.3,我尝试创建索引。失败消息为“除非将include_type_name设置为true,否则映射定义不能嵌套在[_doc]类型下”。这是我的代码: CreateIndexReque
正如您在附件中看到的那样,我想创建一个名为movie的映射,但是出现以下错误: 解析映射[_doc]失败:根映射定义具有不支持的参数: { "mappings": { "movie":{
看来 Mongoose 在内部做了一些非常时髦的事情。 var Foo = new mongoose.model('Foo', new mongoose.Schema({a: String, b: N
我的NEST代码曾经与Elasticsearch版本6一起使用,在Elastichsearch版本7中抛出以下错误: Failed to parse mapping [_doc]: Root mapp
我正在查看 ElasticSearch 5.6 上的单一类型索引示例,为删除映射类型做准备。具体来说,我正在运行来自 ElasticSearch page about the removal of t
在mongoose find查询执行中,响应数据为多个对象,真正的数据在_doc属性或字段中,它只出现在某些场景中。我可以通过获取 Obj._doc.something 来处理数据,但我无法编辑数据并
在 mongoosejs 中执行 find() 后我有一个问题。 有没有更好的方法只获取 _doc 对象而不循环遍历整个查询结果? 我正在搜索类似 model.getDoc() 的内容,但找不到。 谢
我正在关注 6.0 版的 elasticsearch 指南: https://www.elastic.co/guide/en/elasticsearch/reference/master/remova
我正在从我正在学习的类(class)中学习一些 JavaScript 后端编程。它专注于 ExpressJS、MongoDB 和 GraphQL。因为我喜欢让事情对自己更具挑战性,所以我决定在使用 T
我是 java 脚本新手,正在使用 mongoose 构建 graphql API当我想使用 mongoose 返回 myModel.find() 的结果时,我发现 model 和 model._do
我想知道 ._doc 在 mongoose 或 mongodb 中的确切含义。以及为什么 destructuring/... 在 console.log 中显示错误,但在 return 语句中工作正常
我在一个简单的项目中使用 Node、Passport、LocalStrategy、Mongoose,并且有 2 个项目问题... 为什么 UserModel.findOne(...) 返回的 user
在索引中创建新行时出现以下错误 虽然我的函数是用这种格式编写的 在此先多谢 最佳答案 在Elasticsearch 6+中创建的索引中不支持多种映射类型。 您不需要在文档索引请求it has been
我正在尝试实现 Micrometer Elasticsearch 注册表,但出现以下错误 { "took": 158, "errors": true, "items
我正在尝试将数据发送到 elasticsearch,但遇到了一个问题,我的数字字段仅作为字符串出现。这些是我采取的步骤。 步骤 1. 添加索引和 map PUT http://123.com:5101
目前,我使用的客户端go-elasticsearch版本v7.8.0和elastic版本8.1.2。 Elasticsearch 从版本 7.x 更新 现在,当我尝试更新文档时,它失败并出现以下错误。
我过去使用 npm 包 express-jwt 来轻松进行 JWT 签名、解码等。通常(和 according to the docs )它会拦截请求,使用用户对象有效负载解码 token 并设置 r
我是一名优秀的程序员,十分优秀!