我正在尝试通过添加对象(如果它不存在)更新文档中的数组,否则替换数组中的对象。但是没有任何东西($ push,$ addToSet)除了$ set参数做任何事情,$ set按预期工作 - 覆盖整个数组。 我的猫鼬模式:
<div class="col-md-6 col-md-offset-3">
<p>Define your competencies details here.</p>
<%= form_for @user_profile do |user_profile_form| %>
<% @user_profile.procedure_categories.each do |procedure_category| %>
<h2><%= procedure_category.category %></h2>
<table class='table'>
<thead>
<tr>
<th>Competency</th>
<th>Years experience</th>
<th>Time it takes to complete</th>
<th>Do you want to do this?</th>
</tr>
</thead>
<tbody class="categories">
<%= user_profile_form.fields_for :competencies, @user_profile.competencies.where(procedure_id: procedure_category.procedures) do |cf| %>
<tr>
<td><%= cf.object.id %></td>
<td><%= cf.text_field :time, class: 'form-control' %></td>
<td><%= cf.text_field :rating, class: 'form-control' %></td>
<td>TBD</td>
</tr>
<% end %>
</tbody>
</table>
<% end %>
<%= user_profile_form.submit "Save competencies", class: "btn btn-primary" %>
<% end %>
</div>
邮政请求处理程序:
var cartSchema = mongoose.Schema({
mail: String,
items: Array
});
我从客户端发送的数据:
app.post('/addToCart', function(req, res) {
var request = req.body;
Cart.findOneAndUpdate({
"mail": request.mail
}, {
$addToSet: {
"items": request.item
}
}, {
upsert: true
},
function(err, result) {
console.log(result);
}
);
res.send(true);
});
编辑:
当我触发'addToCart'请求时,我也会收到此日志:
{
"mail":"test@gmail.com",
"item":{
"_id":"59da78db7e9e0433280578ec",
"manufacturer":"Schecter",
"referenceNo":"Daemon-412",
"type":"Gitare",
"image":"images/ba9727909d6c3c26412341907e7e12041507489988265.jpeg",
"__v":0,
"subcategories":[
"Elektricne"
]
}
}
答案 0 :(得分:0)
这应该工作你只需要实现objectExits
函数来测试该项是否是你正在寻找的那个:
Cart.findOne({ "mail": request.mail })
.exec()
.then(cart => {
var replaced = cart.items.some((item, i) => {
if (item._id == request.item._id)) {
cart.items[i] = request.item;
return true;
}
})
if (!replaced) {
cart.items.push(request.item);
}
cart.save();
return cart;
})
.catch(err => {
console.log(err)
});
答案 1 :(得分:0)
如果现有文档具有完全相同的字段和值,并且字段的顺序相同,则$ addToSet中的比较将成功仅。否则操作员将失败。
因此,在您的情况下,request.item始终需要完全相同。
我建议创建一个“项目”模型。然后,您的购物车架构将如下:
var cartSchema = mongoose.Schema({
mail: String,
items: [{
type: ObjectId,
ref: 'item',
}],
});
让MongoDB确定该项目是否存在。