gpt4 book ai didi

node.js - “卡住” Mongoose 子文档

转载 作者:太空宇宙 更新时间:2023-11-04 01:07:31 25 4
gpt4 key购买 nike

我的设置类似于:

B.js

var schemaB = new mongoose.Schema({
x: Number,
...
});
module.exports = mongoose.model('B', schemaB);

A.js

var schemaA = new mongoose.Schema({
b: {type: mongoose.Schema.Types.ObjectId, ref: 'B'},
...
});
module.exports = mongoose.model('A', schemaA);

这样,当我使用 populate() 检索我的 A 文档时,我的 B 文档就会发生更改。 ,这些更改将反射(reflect)在路径 b 处的对象中。

但是,是否有某种方法可以“卡住”特定 A 文档的路径 b 处的文档?像这样的东西:

var id=1;
A.findById(id).populate('b').exec(function(err, a) {
if (err) return handleErr(err);

console.log(a.b.x);
// prints 42

a.freeze('b') // fictitious freeze() fn
b.x=20;

b.save(function(err, b) {
if (err) return handleErr(err);

console.log(b.x);
// prints 20

A.findById(id).populate('b').exec(function(err, a) {
if (err) return handleErr(err);

console.log(a.b.x);
// prints 42

});
});
});

最佳答案

没有上下文,我不完全确定你为什么需要这样做。看来这个问题是不是应该从更高的层面来看待?

我确实知道的一件事是 toJSON功能。它剥离了 Mongoose 元数据和逻辑,只留下一个普通的 JS 对象。除非您更改该对象,否则它不会更改。然后,您可以将此对象作为与 b 不同的属性添加到 a 上。

// A.js

var schemaA = new mongoose.Schema({
b: {type: mongoose.Schema.Types.ObjectId, ref: 'B'},
frozenB: {}
...
});
<小时/>
// app.js

var id=1;
A.findById(id).populate('b').exec(function(err, a) {
if (err) return handleErr(err);

console.log(a.b.x);
// prints 42

a.frozenB = a.b.toJSON(); // Creates new object and assigns it to secondary property

a.save(function (err, a) {
b.x=20;

b.save(function(err, b) {
if (err) return handleErr(err);

console.log(b.x);
// prints 20

A.findById(id).populate('b').exec(function(err, a) {
if (err) return handleErr(err);

console.log(a.frozenB);
// prints 42

});
});
});
});
<小时/>

编辑 - 如果您需要 frozenB 成为完整的 Mongoose 文档,那么只需执行相同的操作,但将其设为新文档。

// A.js

var schemaA = new mongoose.Schema({
b: {type: mongoose.Schema.Types.ObjectId, ref: 'B'},
frozenB: {type: mongoose.Schema.Types.ObjectId, ref: 'B'}
...
});
<小时/>
// app.js

var id=1;
A.findById(id).populate('b').exec(function(err, a) {
if (err) return handleErr(err);

console.log(a.b.x);
// prints 42

var frozenB = a.b;
delete frozenB._id; // makes it a new document as far as mongoose is concerned.
frozenB.save(function (err, frozenB) {
if (err) return handleErr(err);

a.frozenB = frozenB;

a.save(function (err, a) {
b.x=20;

b.save(function(err, b) {
if (err) return handleErr(err);

console.log(b.x);
// prints 20

A.findById(id).populate('b').exec(function(err, a) {
if (err) return handleErr(err);

console.log(a.frozenB);
// prints 42

});
});
});
});
});

关于node.js - “卡住” Mongoose 子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21712275/

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