sql >> データベース >  >> NoSQL >> MongoDB

Sails.jsとWaterlineを使用してMongoDBサブドキュメント内の特定のキーを更新するにはどうすればよいですか?

    .native()> モデルのメソッドで、mongoドライバーに直接アクセスしてから、 $ set フィールドを個別に更新する演算子。ただし、最初にオブジェクトを次のようなドット表記の1レベルのドキュメントに変換する必要があります

    {
        "name": "Dan",
        "favorites.season": "Summer"
    }
    

    これを次のように使用できるようにします:

    var criteria = { "id": "1" },
        update = { "$set": { "name": "Dan", "favorites.season": "Summer" } },
        options = { "new": true };
    
    // Grab an instance of the mongo-driver
    Person.native(function(err, collection) {        
        if (err) return res.serverError(err);
    
        // Execute any query that works with the mongo js driver
        collection.findAndModify(
            criteria, 
            null,
            update,
            options,
            function (err, updatedPerson) {
                console.log(updatedPerson);
            }
        );
    });
    

    更新が必要なrawオブジェクトを変換するには、次の関数を使用します

    var convertNestedObjectToDotNotation = function(obj){
        var res = {};
        (function recurse(obj, current) {
            for(var key in obj) {
                var value = obj[key];
                var newKey = (current ? current + "." + key : key);  // joined key with dot
                if  (value && typeof value === "object") {
                    recurse(value, newKey);  // it's a nested object, so do it again
                } else {
                    res[newKey] = value;  // it's not an object, so set the property
                }
            }
        })(obj);
    
        return res;
    }
    

    その後、更新を次のように呼び出すことができます

    var criteria = { "id": "1" },
        update = { "$set": convertNestedObjectToDotNotation(params) },
        options = { "new": true };
    

    以下のデモを確認してください。

    var example = {
    	"name" : "Dan",
    	"favorites" : {
    		"season" : "winter"
    	}
    };
    
    var convertNestedObjectToDotNotation = function(obj){
    	var res = {};
    	(function recurse(obj, current) {
    		for(var key in obj) {
    			var value = obj[key];
    			var newKey = (current ? current + "." + key : key);  // joined key with dot
    			if	(value && typeof value === "object") {
    				recurse(value, newKey);  // it's a nested object, so do it again
    			} else {
    				res[newKey] = value;  // it's not an object, so set the property
    			}
    		}
    	})(obj);
    	
    	return res;
    }
    
    
    var update = { "$set": convertNestedObjectToDotNotation(example) };
    
    pre.innerHTML = "update =  " + JSON.stringify(update, null, 4);
    <pre id="pre"></pre>


    1. OSX上のMongoDBの正常なデフォルト?

    2. mongodbデータディレクトリの権限

    3. 配列要素に基づいてオブジェクトを検索し、一致する配列要素のみを返しますか?

    4. Model.findはマングースの関数ではありません