Как обновить схему без одного объекта в мангусте

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
        }
    ]
}

Важно отметить несколько вещей:

  1. Коллекция «из» , в этом случае books_selling_data не может быть оговорено.
  2. Поле «as» будет массивом, как пример выше.
  3. Опции «localField» и «foreignField» на этапе поиска $ будут считаться нулевыми для целей сопоставления, если они не существуют в их соответствующих коллекциях (в этом случае $ lookup docs имеет прекрасный пример).

Итак, в качестве вывода, если вы хотите объединить обе коллекции, имея в данном случае плоский copy_sold поле с полными проданными копиями, вам придется немного поработать, возможно, используя промежуточную коллекцию, которая затем будет $ out до окончательной коллекции.

1
задан Metin Süt 16 January 2019 в 13:06
поделиться

1 ответ

Хорошо, чтобы сделать это, вы можете сделать это

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 поля, все поля, что вам нравится. Вы можете иметь полный контроль над обновлением

0
ответ дан THEWOLF 16 January 2019 в 13:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: