4

スキーマを持つモデルがあります:

schema = new Schema({
    name: String,
    sections: [{
        name: String,
        columns: [{
            name: String      
        }]
    }]
}];

//Lets call the model a Page

簡単にするために、モデル全体を取得します。

app.get('/page/:name', function(req, res){
    Page.findOne( {name: req.params.name}, function(err, page){
        //error handling
        res.send page
    });
});

リクエストGET/page / myPageで私は受け取ります:

{
    //_id, __v, etc..
    name: 'myPage',
    sections: [{
        name: 'Section 1',
        columns [{
            name: 'My #1 Column'
        }]
    }]
}

列0の名前をMy#1 Column FOOBARに変更します!クライアントで

{
    //_id, __v, etc..
    name: 'myPage',
    sections: [{
        name: 'Section 1',
        columns [{
            name: 'My #1 Column FOOBAR!'
        }]
    }]
}

別のユーザーが「My#2Column!!!」という名前の列を追加します。

   {
        //_id, __v, etc..
        name: 'myPage',
        sections: [{
            name: 'Section 1',
            columns [{
                name: 'My #1 Column'
            },
            {
                name: 'My #2 Column!!!'
            }]
        }]
    }

両方のユーザーが非同期JSON全体をサーバーにPOSTします。それらをマージしたい。

これが私の現在の保存方法です:

app.post('/page/save', function(req, res) {
  var newPage = req.body.page;

  Page.findOne({
    _id: newPage._id
  }, function(err, page) {
    if (err) {
      return res.send(err);
    }

    // this portion is obviously problematic as it doesn't merge the objects
    // it simply overwrites it with whatever page JSON you received at the time
    // of the request.
    page.sections = newPage.sections;

    page.save(function(err) {
      if (err) {
        res.send(err);
      } else {
        res.send('success!');
      }
    });

  });
});

独自の更新キューを作成する必要がありますか。最初にサーバーから最新のドキュメントを取得し、ドキュメントをマージしてから保存します。または、これはmongodbによって処理されますか。

また、古いオブジェクトを新しいオブジェクトとマージして保存するupdateのような簡単なメソッドはありますか?

ありがとうございました。

4

2 に答える 2

6

私はこのようにします:

.put('/:pr_id', (req, res, next) => {
      let pr_id = req.params.pr_id;


      PR.findById(pr_id, (err, doc) => {
        if (err) {
          return res.status(500).json({error: err});
        }
        if (!doc){
          return res.status(404).json({error: 'Document not found'});
        }

        let updated = req.body.pr;
        Object.assign(doc, updated);

        doc.save((err) => {
          if (err) {
            return res.status(500).json({error: err});
          }

          res.json(doc);
        });
      });

Object.assign は基本的に両方のオブジェクトをマージします ( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign )

于 2016-03-02T14:15:20.830 に答える
-1

_.mergeメソッドは注意して使用できます。マングース ドキュメントをマージすることはできません.lean().toObject()

Model.update({
  _id: doc._id
}, {
  $set: _.merge(doc.toObject(), {
    stuff: {
      hello: 'world'
    }
  })
})
于 2015-06-25T21:33:33.937 に答える