2016-09-29 1 views
1

Предположим, что у меня есть документ в базе данных, который имеет следующую структуру;Как обновить документ с помощью динамических полей в node.js

id: 1, 
name: alex, 
age: 21 

Есть некоторые обновления в стороне клиента и тот же документ с id:1 возвращается как;

id: 1, 
name: alex, 
age: 21, 
location: usa 

где добавляется новое поле location.

Я хочу обновить документ в базе данных. Я хочу добавить это новое вставленное поле, но я не мог узнать, как я могу справиться с этой ситуацией. Потому что location не является статическим, это может быть surname, job и так далее. Таким образом, новые вставленные поля являются динамическими, и я не знаю заранее.

Если поле location было статическим, я мог бы написать запрос как;

db.collection("user").updateOne({id: 1}, 
        {$set: {name: "alex", age: "21", location: "usa"}}, function(err, result){ 
    if(err){} 
    else{} 
}); 

Но теперь, как я могу обновить документ с помощью этих недавно добавленных полей?

+0

Итак, ваш вопрос, похоже, больше о том, как вы запрашиваете, а не о том, как вы обновляете? вставка документа ничем не отличается от любого другого времени, если вы не применяете схемы через мангуст или подобное. – Paul

+0

Но я устанавливал поля, как в примере. Теперь, как я могу установить их? Я заранее не знаю поля. Я не смог обновить документ с помощью id: 1. – user6468132

ответ

2

Если вы говорите, что у вас есть обновленный объект:

id: 1, 
name: alex, 
age: 21, 
location: usa 

то я полагаю, что у вас есть объект, который имеет значение:

{ 
    id: 1, 
    name: 'alex', 
    age: 21, 
    location: 'usa' 
} 

например в результате разбора этого JSON посланный от клиента:

{ 
    "id": 1, 
    "name": "alex", 
    "age": 21, 
    "location": "usa" 
} 

Если у вас есть этот объект в переменной с именем object то все, что вам нужно сделать, это:

db.collection("user") 
    .updateOne({id: object.id}, {$set: object}, function (err, result) { 
    if (err) { 
     // handle success 
    } else { 
     // handle success 
    } 
}); 

Но, скорее всего, вы будете нуждаться использовать _id вместо id:

db.collection("user") 
    .updateOne({_id: object._id}, {$set: object}, function (err, result) { 
    if (err) { 
     // handle success 
    } else { 
     // handle success 
    } 
}); 

Если вы хотите, чтобы иметь возможность удалить свойства, а затем, возможно, даже:

db.collection("user") 
    .replaceOne({_id: object._id}, object, function (err, result) { 
    if (err) { 
     // handle success 
    } else { 
     // handle success 
    } 
}); 

Я не рекомендовал бы положить в базу данных без по крайней мере, какой-то проверки, но это можно делать то, что вы спрашиваете о так, как показано выше.

Для получения дополнительной информации см:

в Introduction to MongoDB in Node.js.

Смежные вопросы