MongoDB 3.2 теперь позволяет объединять данные из нескольких коллекций в один через $ этап агрегации поиска . В качестве практического примера можно сказать, что у вас есть данные о книгах, разделенных на две разные коллекции.
Первая коллекция, называемая books
, имеющая следующие данные:
{
"isbn": "978-3-16-148410-0",
"title": "Some cool book",
"author": "John Doe"
}
{
"isbn": "978-3-16-148999-9",
"title": "Another awesome book",
"author": "Jane Roe"
}
И второй сбор, называемый books_selling_data
, имеющий следующие данные:
{
"_id": ObjectId("56e31bcf76cdf52e541d9d26"),
"isbn": "978-3-16-148410-0",
"copies_sold": 12500
}
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 720050
}
{
"_id": ObjectId("56e31ce076cdf52e541d9d29"),
"isbn": "978-3-16-148999-9",
"copies_sold": 1000
}
Чтобы объединить обе коллекции, просто нужно использовать $ lookup следующим образом:
db.books.aggregate([{
$lookup: {
from: "books_selling_data",
localField: "isbn",
foreignField: "isbn",
as: "copies_sold"
}
}])
После этой агрегации коллекция books
будет выглядеть следующим образом:
{
"isbn": "978-3-16-148410-0",
"title": "Some cool book",
"author": "John Doe",
"copies_sold": [
{
"_id": ObjectId("56e31bcf76cdf52e541d9d26"),
"isbn": "978-3-16-148410-0",
"copies_sold": 12500
}
]
}
{
"isbn": "978-3-16-148999-9",
"title": "Another awesome book",
"author": "Jane Roe",
"copies_sold": [
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 720050
},
{
"_id": ObjectId("56e31ce076cdf52e541d9d28"),
"isbn": "978-3-16-148999-9",
"copies_sold": 1000
}
]
}
Важно отметить несколько вещей:
books_selling_data
не может быть оговорено. Итак, в качестве вывода, если вы хотите объединить обе коллекции, имея в данном случае плоский copy_sold поле с полными проданными копиями, вам придется немного поработать, возможно, используя промежуточную коллекцию, которая затем будет $ out до окончательной коллекции.
Хорошо, чтобы сделать это, вы можете сделать это
User.findOne({ _id: req.user._id },(err,user)=>{
if(err) throw err;
user.FieldYouWantToUpdate = req.body.name // likewise add your values
// then save the document
user.save();
});
Здесь вы можете больше контролировать себя при обновлении с помощью mongoose. Что происходит, когда вы делаете запрос, используя идентификатор пользователя, и получаете пользователя. так что пользовательский объект может быть доступен в обратном вызове функции findOne (). После этого, используя пользовательский объект, вы можете изменять пользователя по своему желанию, может быть это одно поле, 2 поля, все поля, что вам нравится. Вы можете иметь полный контроль над обновлением