Node.js 如何仅向mongoose架构中的子文档数组添加唯一项--$addToSet
我正在构建一个应用程序来自学fullstack web开发。在我的应用程序中,每个用户都有一个recipebox,显示他们添加的食谱。如何确保仅向用户配方框添加唯一的条目?在过去的几个小时里,我一直在摸索$addToSet(这些文档帮不上什么忙),但它似乎不起作用。我倾向于使用mongoose提供的功能,因为我已经有了一个很长的函数使它工作 在我这里的插入操作中,配方被分配了唯一的ID,所以看起来它们总是被添加。如果这就是mongo所做的,那么我似乎需要在模式中添加一个“name”属性并进行检查,但我不确定。我不清楚被分配的ID是帮助还是伤害。。。。这是我的路由和DB插入操作。感谢您的指导。如何确保配方框中只添加唯一的条目?(done属性用于网站上的复选框,忽略:))。我已经包括了“填充”,因为最终我想返回实际的食谱,而不仅仅是它们的IDNode.js 如何仅向mongoose架构中的子文档数组添加唯一项--$addToSet,node.js,mongodb,Node.js,Mongodb,我正在构建一个应用程序来自学fullstack web开发。在我的应用程序中,每个用户都有一个recipebox,显示他们添加的食谱。如何确保仅向用户配方框添加唯一的条目?在过去的几个小时里,我一直在摸索$addToSet(这些文档帮不上什么忙),但它似乎不起作用。我倾向于使用mongoose提供的功能,因为我已经有了一个很长的函数使它工作 在我这里的插入操作中,配方被分配了唯一的ID,所以看起来它们总是被添加。如果这就是mongo所做的,那么我似乎需要在模式中添加一个“name”属性并进行检查
app.post('/api/recipebox', function(req, res) {
var recipe = new Recipe({
recipeUrl: req.body.recipe.source.sourceRecipeUrl,
image: req.body.recipe.images[0].hostedSmallUrl,
numServings: req.body.recipe.numberOfServings,
Ingredients: req.body.recipe.ingredientLines,
NutritionalInformation: req.body.recipe.nutritionEstimates,
name: req.body.recipe.name,
totalTime: req.body.recipe.totalTime
});
var userId = req.user._id;
var query = {
_id: userId
};
var recipeId = recipe._id;
recipe.save(function(err, recipe) {
if(err) {
throw err;
}
User.findByIdAndUpdate(userId, {
$addToSet: {
recipeBox: {
_id: recipeId,
name: req.body.recipe.name
}
}
}).populate('recipeBox').exec(function(err, _user) {
if(err) {
throw err;
}
console.log(_user);
});
});
});
我检查了一下,var recipeId实际上等于第一次回调中的“recipe”参数,对于它为什么不起作用非常困惑——我是否遗漏了回调操作的某些内容
更新:
我试过这个,但也不起作用:
recipe.save(function (err, recipe) {
if (err) {
throw err;
}
console.log("SECOND PARAMETER RECIPE ID", recipe._id);
User.findByIdAndUpdate(userId, {
$addToSet: {
recipeBox: recipeId
}
}).populate('recipeBox').exec(function (err, user) {
console.log("ANOTHER PARAMETER", user);
if (err) {
throw err;
}
user.save();
// broadCastStream();
});
// broadCastStream();
});
用户架构:
var userSchema = new Schema({
email: {
type: String,
unique: true
},
password: String,
resetPasswordToken: String,
resetPasswordExpires: Date,
picture: ObjectId,
name: String,
facebook: {
id: String,
token: String,
pictures: String
},
recipeBox: [{_id: ObjectId, name: String, done: Boolean}]
});
尝试以下操作,而不是添加对象
$addToSet{recipeBox:recipeId}
请查看我的更新代码它不工作!好吧,您已经找到了原因-因为您使用的是两个不同的集合recipes和users,并且您总是添加到recipe集合中,它会获得一个唯一的id,这将始终添加到users集合中。如果您希望确保用户不能两次添加同一配方,那么您还需要一种机制来唯一地标识配方,可能是通过匹配recipeurl。