MongoDB вставляет документ для каждого документа в другой коллекции

У меня есть коллекция (users), содержащая некоторые документы, например:

{
    _id: ObjectId("56d45406be05db4022be51f9"),
    morecontent : ""
},
{
    _id: ObjectId("56d45406be05db3021be32e3"),
    morecontent : ""
}

Я хотел бы создать новый документ для каждой записи в коллекции user. Документы будут созданы из объекта уведомления следующим образом:

{
    type: 'alert',
    msg: 'This is important'
}

Коллекция notifications должна выглядеть примерно так:

{
    _id: ObjectId("56d45406be05db3021bf20a1"),
    someoldcontent: "This was here before the request"
},
{
    _id : ObjectId("56d45406be05db4022be20b1"),
    user: ObjectId("56d45406be05db4022be51f9"),
    type: 'alert',
    msg: 'This is important'
},
{
    _id : ObjectId("56d45406be05db3021be32e3"),
    user: ObjectId("56d45406be05db3021be32e3"),
    type: 'alert',
    msg: 'This is important'
}

Есть ли способ сделать это в запросе mongodb?


person Samuel Rondeau-Millaire    schedule 29.02.2016    source источник
comment
что вы будете использовать в качестве db-клиента? (узел, java, С#) или вы хотите просто получить запрос для этого?   -  person profesor79    schedule 29.02.2016
comment
@profesor79 Я бы использовал nodejs   -  person Samuel Rondeau-Millaire    schedule 29.02.2016
comment
Я не уверен, что правильно понял ваш вопрос 1. пользователь выполняет действие 2. приложения делают вставку в коллекцию уведомлений, используя _id пользователя   -  person profesor79    schedule 29.02.2016
comment
@profesor79 Я хочу вставить объект в коллекцию уведомлений для каждого пользовательского документа, который есть в пользовательской коллекции. Уведомление будет одинаковым для всех пользователей, за исключением того, что у него должен быть другой user_id. Уведомления должны быть в коллекции уведомлений.   -  person Samuel Rondeau-Millaire    schedule 29.02.2016
comment
давайте поговорим здесь chat.stackoverflow.com/rooms/104903/mongo-queries-issues   -  person profesor79    schedule 29.02.2016


Ответы (2)


Спасибо professor79 за то, что очень помогли мне с вопросом.

После долгих усилий запрос был найден. Мы использовали структуру агрегации, чтобы добиться успеха.

Нужны только две агрегации: $project и $out. $out автоматически позаботится о новом _id в документе notification.

Учитывая эту коллекцию с именем user :

{
    _id: ObjectId("56d45406be05db4022be51f9"),
    morecontent : ""
},
{
    _id: ObjectId("56d45406be05db3021be32e3"),
    morecontent : ""
}

Мы хотим создать уведомление, содержащее одинаковые поля msg и type для каждого документа в коллекции user. Каждое уведомление будет в коллекции notifications и будет иметь ссылку на соответствующий userId.

Вот запрос для достижения такого результата:

db.user.aggregate([
    {
        $project: {
            userId: '$_id',
            type: { $literal: 'danger' },
            msg: { $literal: 'This is a message' },
        },
    },
    { $out: 'notifications' },
])

Вывод в коллекции notifications:

{
    "_id" : ObjectId("56d6112e197b4ea11a87de1a"),
    "userId" : ObjectId("56d45406be05db4022be51f9"),
    "type" : "danger",
    "msg" : "This is a message"
},
{
    "_id" : ObjectId("56d6112e197b4ea11a87de1b"),
    "userId" : ObjectId("56d45406be05db3021be32e3"),
    "type" : "danger",
    "msg" : "This is a message"
}
person Samuel Rondeau-Millaire    schedule 02.03.2016

Поскольку у нас есть немного чата, чтобы прояснить проблему:

шаги, необходимые для выполнения этой операции на стороне сервера:

  1. первый шаг - сопоставить > получить идентификатор пользователя
  2. идентификаторы проекта в новые документы по мере необходимости
  3. out -> сохранить вывод в коллекции уведомлений
person profesor79    schedule 29.02.2016