Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用其他字段的数据创建ID_Javascript_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Javascript 使用其他字段的数据创建ID

Javascript 使用其他字段的数据创建ID,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我是mongodb的新手,我正在使用mongoose来验证和排序数据(如果这不起作用,我愿意将其更改为MySQL)。 该应用程序将是一个电子商店,用于购买与电影、游戏等相关的商品 我的模式如下: var productSchema = { id: { type: String, required: true }, name: { type: String, required: true },

我是mongodb的新手,我正在使用mongoose来验证和排序数据(如果这不起作用,我愿意将其更改为MySQL)。 该应用程序将是一个电子商店,用于购买与电影、游戏等相关的商品

我的模式如下:

var productSchema = {
    id: {
        type: String,
        required: true
    },
    name: {
        type: String,
        required: true
    },
    img: {
        type: String,
        required: true
    },
    price: {
        type: Number,
        required: true
    },
    stock: {
        type: Number,
        required: true
    },
    category: {
        object: {
            type: String,
            required: true
        },
        group: {
            type: String,
            required: true  
        },
        name: {
            type: String,
            required: true
        }
    }
};
这就是我想做的: 如果我在类别中有以下数据:

  • category.object=“环”
  • category.group=“电影”
  • category.name=“指环王”
我希望id由类别中每个字段的第一个字母和一个数字(最后添加的项目的数字加上1)组成。在本例中,它将是RMLOTR1

我现在在做什么 我同时添加了很多数据,所以每次我这样做的时候,我都会创建一个函数,迭代所有添加的项,并执行我想要的操作,但是

我的问题是 对于mongodb或mongoose,是否有一种内置的方法可以做到这一点,即在添加数据的同时创建id?我知道我可以做一个虚拟的,但我想把数据存储起来

附加服务

  • 如果mongodb不能做到这一点,有没有办法用MySQL做到这一点
  • 做这种事被认为是正确/错误的方法吗

您基本上是在寻找通过在集合中创建新文档而触发的“save”事件的挂钩。这将检查当前文档内容并从值中提取“字符串”,以便为
\u id
创建“前缀”值

还有另一个部分,“前缀”需要添加数字计数器,当该特定“前缀”已经存在一个值以使其不同时。MongoDB中有一种常用的技术,它基本上涉及保持一个“counters”集合,并在每次访问它时递增该值

作为一个完整且自包含的演示,您可以将以下技术结合起来:

var productSchema = {
    id: {
        type: String,
        required: true
    },
    name: {
        type: String,
        required: true
    },
    img: {
        type: String,
        required: true
    },
    price: {
        type: Number,
        required: true
    },
    stock: {
        type: Number,
        required: true
    },
    category: {
        object: {
            type: String,
            required: true
        },
        group: {
            type: String,
            required: true  
        },
        name: {
            type: String,
            required: true
        }
    }
};
var async=require('async'),
mongoose=require('mongoose'),
Schema=mongoose.Schema;
猫鼬mongodb://localhost/warehouse');
var counterSchema=新模式({
“type”:{“type”:String,“required”:true},
“prefix”:{“type”:String,“required”:true},
“计数器”:数字
});
索引({“type”:1,“prefix”:1},{“unique”:true});
counterSchema.virtual('nextId').get(函数(){
返回this.prefix+this.counter;
});
var productSchema=新模式({
“_id”:“字符串”,
“类别”:{
“对象”:{“类型”:字符串,“必需”:true},
“组”:{“类型”:字符串,“必需”:true},
“name”:{“type”:String,“required”:true}
}
},{u id:false});
productSchema.pre('save',函数(下一步){
var self=这个;
如果(!self.hasOwnProperty(“\u id”)){
var prefix=self.category.object.substr(0,1).toUpperCase()
+self.category.group.substr(0,1).toUpperCase()
+self.category.name.split(“”).map(函数(word){
返回word.substr(0,1).toUpperCase();
}).加入(“”);
mongoose.model('Counter').findOneAndUpdate(
{“类型”:“产品”,“前缀”:前缀},
{“$inc”:{“计数器”:1},
{“new”:true,“upsert”:true},
功能(错误、计数器){
self.\u id=counter.nextId;
下一个(错误);
}
);
}否则{
next();//当_id已经存在时跳过
}
});
var Product=mongoose.model('Product',productSchema),
计数器=猫鼬。型号(“计数器”,计数器模式);
异步系列(
[
//干净数据
函数(回调){
async.each([Product,Counter],函数(model,callback){
删除({},回调);
},回调);
},
函数(回调){
async.each(
[
{
“类别”:{
“对象”:“环”,
“组”:“电影”,
“名字”:“指环王”
}
},
{
“类别”:{
“对象”:“环”,
“组”:“电影”,
“名字”:“四个婚礼一个葬礼”
}
},
{
“类别”:{
“对象”:“环”,
“组”:“电影”,
“名字”:“指环王”
}
}
],
函数(数据、回调){
Product.create(数据、回调)
},
回拨
)
},
函数(回调){
Product.find().exec(函数(错误,产品){
控制台日志(产品);
回调(err);
});
},
函数(回调){
Counter.find().exec(函数(err,counters){
控制台日志(计数器);
回调(err);
});
}
],
功能(err){
如果(错误)抛出错误;
mongoose.disconnect();
}
)
这将为您提供如下输出:

[{类别:{名称:{指环王',组:'movies',对象:'ring'},
__v:0,
_id:'RMLOTR1'},
{类别:
{姓名:'四场婚礼和一场葬礼',
小组:"电影",,
对象:'环'},
__v:0,
_id:'RMFWAAF1'},
{类别:{名称:'魔戒',组:'电影',对象:'魔戒'},
__v:0,
_id:'RMLOTR2'}]
[{uuv:0,
柜台:2,,
类型:'产品',
前缀:“RMLOTR”,
_id:57104cdaa774fcc73c1df0e8},
{uuv:0,
柜台:1,,
类型:'产品',
前缀:“RMFWAAF”,
_id:57104cdaa774fcc73c1df0e9}]
为了首先理解
计数器
模式和模型,您基本上是在定义一些内容,在这些内容中,您将查找“unique”键,并在匹配时将数字字段附加到“increment”上。为了方便起见,它只定义了组成唯一组合的两个字段和一个复合索引。如果需要的话,这也可以是一个化合物
\u id

另一个便利是
nextId
virtual
方法,它只是将“前缀”和“计数器”值串联起来。由于您的
计数器
mod,因此在此处包含类似“type”的内容也是最佳做法