gpt4 book ai didi

node.js - Mongoose : "_doc"怎么了?

转载 作者:IT老高 更新时间:2023-10-28 13:14:15 26 4
gpt4 key购买 nike

看来 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])时,会发生一些事情:

  1. 在对象实例上设置值之前调用 Mongoose 代码(与简单的 JavaScript 对象不同)
  2. Mongoose 创建一个数组(可选)来存储包含数组数据的数据(一个 MongooseArray)。在您提供的示例中,由于您没有传递数组,因此将创建它。
  3. Mongoose 会尝试将您的数据转换为正确的类型
  4. 它将对作为转换的一部分传递的数据调用 toString

因此,结果是文档现在包含一个数组,其中包含您传递的对象的 toString 版本。

如果您检查 goo 属性的内容,您会发现它现在是一个包含单个元素的数组,它是一个包含 [object Object] 的字符串>。如果您选择了更基本的类型或匹配目标属性存储类型,您会发现基本的相等性检查会起作用。

关于node.js - Mongoose : "_doc"怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18821212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com