MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да актуализирам конкретен ключ в поддокумент на MongoDB с помощта на Sails.js &Waterline?

Можете да използвате .native() метод на вашия модел, който има директен достъп до драйвера mongo и след това $set оператор за актуализиране на полетата независимо. Трябва обаче първо да преобразувате обекта в документ на едно ниво, който има нотация с точка като

{
    "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);
        }
    );
});

За да конвертирате необработения обект, който трябва да бъде актуализиран, използвайте следната функция

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да осредним сумираните стойности в mongodb?

  2. Актуализирайте стойност в MongoDB въз основа на текущата й стойност

  3. mongodb агрегат за получаване на дължина на първия вложен масив/списък

  4. mongoose Сравняване на дата без време и група по createdAt и staffId със седмичен, месечен и годишен общ брой персонал чрез обобщаване?

  5. mongo:връщането не е равно на count()