Jam*_*een 14 javascript mongoose mongodb node.js mongoose-schema
我有
Page.findById(pageId).then(page => {
const pageId = page.id;
..
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果没有给出页面ID,它应该只是在给定一些条件的情况下获取第一个可用页面,这是由完成的
Page.findOne({}).then(page => {
const pageId = page.id;
..
});
Run Code Online (Sandbox Code Playgroud)
但如果没有找到任何页面,它应该创建一个新页面并使用它,这是完成的
Page.create({}).then(page => {
const pageId = page.id;
..
});
Run Code Online (Sandbox Code Playgroud)
但是如何将所有这些组合成尽可能少的线?
我内心有很多逻辑
page => { ... }
Run Code Online (Sandbox Code Playgroud)
所以我非常想做到这一点,所以我可以避免这样做
if (pageId) {
Page.findById(pageId).then(page => {
const pageId = page.id;
..
});
} else {
Page.findOne({}).then(page => {
if (page) {
const pageId = page.id;
..
} else {
Page.create({}).then(page => {
const pageId = page.id;
..
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
我想我也许可以用类似的东西为模式分配一个静态
pageSchema.statics.findOneOrCreate = function (condition, doc, callback) {
const self = this;
self.findOne(condition).then(callback).catch((err, result) => {
self.create(doc).then(callback);
});
};
Run Code Online (Sandbox Code Playgroud)
小智 22
根据Mongoose 文档:
按照之前的SO答案
Model.findByIdAndUpdate()
"找到匹配的文档,根据更新arg更新它,传递任何选项,并将找到的文档(如果有的话)返回给回调."
在选项中将upsert设置为true:
upsert:bool - 如果对象不存在则创建它.默认为false.
Model.findByIdAndUpdate(id, { $set: { name: 'SOME_VALUE' }}, { upsert: true }, callback)
Run Code Online (Sandbox Code Playgroud)
Nin*_*ham 10
承诺async/await版.
Page.static('findOneOrCreate', async function findOneOrCreate(condition, doc) {
const one = await this.findOne(condition);
return one || this.create(doc);
});
Run Code Online (Sandbox Code Playgroud)
用法
Page.findOneOrCreate({ id: page.id }, page).then(...).catch(...)
Run Code Online (Sandbox Code Playgroud)
要么
async () => {
const yourPage = await Page.findOneOrCreate({ id: page.id }, page);
}
Run Code Online (Sandbox Code Playgroud)
与Yosvel Quintero相关的答案对我不起作用:
pageSchema.statics.findOneOrCreate = function findOneOrCreate(condition, callback) {
const self = this
self.findOne(condition, (err, result) => {
return result ? callback(err, result) : self.create(condition, (err, result) => { return callback(err, result) })
})
}
Run Code Online (Sandbox Code Playgroud)
然后使用它像:
Page.findOneOrCreate({ key: 'value' }, (err, page) => {
// ... code
console.log(page)
})
Run Code Online (Sandbox Code Playgroud)
每个Schema都可以为其模型定义实例和静态方法.静态与方法几乎相同,但允许定义直接存在于模型上的函数
静态方法findOneOrCreate:
pageSchema.statics.findOneOrCreate = function findOneOrCreate(condition, doc, callback) {
const self = this;
self.findOne(condition, (err, result) => {
return result
? callback(err, result)
: self.create(doc, (err, result) => {
return callback(err, result);
});
});
};
Run Code Online (Sandbox Code Playgroud)
现在当你有一个实例时,Page你可以打电话findOneOrCreate:
Page.findOneOrCreate({id: 'somePageId'}, (err, page) => {
console.log(page);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19170 次 |
| 最近记录: |