Mongoose:更新文档中的数组不起作用

时间:2017-11-25 19:28:04

标签: javascript node.js mongodb express mongoose

我正在尝试通过添加对象(如果它不存在)更新文档中的数组,否则替换数组中的对象。但是没有任何东西($ 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"
      ]
}
}

2 个答案:

答案 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确定该项目是否存在。