17

Mongoose を使用して、(サブ) ドキュメントに複数のプロパティを一度に設定することは可能ですか? 私がやろうとしていることの例:

私がこのスキーマを持っているとしましょう:

var subSchema = new Schema({
    someField: String,
    someOtherField: String
});

var parentSchema = new Schema({
    fieldOne: String,
    subDocs: [subSchema]
})

それから私はやりたい:

exports.updateMyDocument = function(req, res) {
    var parentDoc = req.parentDoc; // The parent document. Set by parameter resolver.
    var document = req.myDoc; // Sub document of parent. Set by parameter resolver.
    var partialUpdate = req.body; // updated fields sent as json and parsed by body parser
    // I know that the statement below doesn't work, it's just an example of what I would like to do.
    // Updating only the fields supplied in "partialUpdate" on the document
    document.update(partialUpdate); 
    parentDoc.save(function(err) {
        if(err) {
            res.send(500);
            return;
        }
        res.send(204);
    }); 
};

通常、$set演算子を使用してこれを実現できますが、問題はdocument、この例ではparentDoc. だから私がやろうとしたとき

Parent.update({_id: parentDoc._id, "subDocs._id": document._id}, 
    {$set: {"subDocs.$" : partialUpdate}}, 
    function(err, numAffected) {});

によって識別されるサブドキュメント インスタンスを置き換えましたsubDocs._id。現在、フィールドのみを手動で設定することで「解決」していますが、これを行うためのより良い方法を望んでいました。

4

4 に答える 4

37

$setのフィールドに基づいてプログラムでオブジェクトを作成し、ドットpartialUpdate表記を使用してそれらのフィールドだけを更新します。

var set = {};
for (var field in partialUpdate) {
  set['subDocs.$.' + field] = partialUpdate[field];
}
Parent.update({_id: parentDoc._id, "subDocs._id": document._id}, 
    {$set: set}, 
    function(err, numAffected) {});
于 2013-04-08T14:03:34.560 に答える
7

私はRESTアプリケーションで別のことをしました。

まず、私はこのルートを持っています:

router.put('/:id/:resource/:resourceId', function(req, res, next) {
    // this method is only for Array of resources.
    updateSet(req.params.id, req.params.resource, req, res, next);
});

updateSet()方法

function updateSet(id, resource, req, res, next) {
    var data = req.body;
    var resourceId = req.params.resourceId;

    Collection.findById(id, function(err, collection) {
        if (err) {
            rest.response(req, res, err);
        } else {
            var subdoc = collection[resource].id(resourceId);

            // set the data for each key
            _.each(data, function(d, k) {
              subdoc[k] = d;
            });

            collection.save(function (err, docs) {
              rest.response(req, res, err, docs);
            });
        }
    });
}

素晴らしい部分は、このサブドキュメントに対してdataを定義すると、マングースが を検証することです。Schemaこのコードは、配列であるドキュメントのすべてのリソースに対して有効です。簡単にするためにすべてのデータを示しているわけではありませんが、この状況を確認して応答エラーを適切に処理することをお勧めします。

于 2015-02-20T14:55:16.040 に答える