как обновить модель из списка документов в массив в mongodb - PullRequest
1 голос
/ 13 апреля 2020

У нас есть экземпляр MongoDB с коллекцией пользователей, который выглядит примерно так:

{
        "Username": "Amin-AMD",
        "FriendsList": [
            {
                "UserId": "5e076f4b19e8cd000162c962",
                "NickName": "Amin-Mobile",
                "ClanName": null,
                "ClanId": null,
                "Level": NumberInt(1),
                "ActiveCosmeticItems": [
                    "hair0",
                    "skin0",
                    "eye0",
                    "mouth0",
                    "daub0",
                    "acc"
                ],
                "IsOnline": false
            },
            {
                "UserId": "5e08a4a119e8cd000167929e",
                "NickName": "saeed",
                "ClanName": null,
                "ClanId": null,
                "Level": NumberInt(7),
                "ActiveCosmeticItems": [
                    "hair5",
                    "skin2",
                    "eye2",
                    "mouth10",
                    "daub0",
                    "acc0"
                ],
                "IsOnline": false
            }
        ]
    }

Как показано выше, я встроил список друзей в коллекцию наших пользователей. но по причине, нам нужно изменить эту модель, чтобы ссылаться на друзей. Поэтому мне нужно написать запрос для замены всего FriendModel просто на UserId.

Я достиг этого запроса, но он выдает исключение.

db.Users.updateMany({ "FriendsList" : { $ne : [] }}, { $set : { "FriendsList.$" : "FriendsList.$.UserId" }})

На самом деле, для друг, мне просто нужен UserId, поэтому новый FriendsList будет массивом, и он должен выглядеть примерно так:

{
        "Username": "Amin-AMD",
        "FriendsList": [
            "5e076f4b19e8cd000162c962",                
            "5e08a4a119e8cd000167929e"
        ]
    }

MongoDB версия: 4.2.1

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Вы должны сделать это в два этапа:

  1. Обновить существующие данные в БД:

    Поскольку вы можете использовать конвейер агрегации в обновлениях стартовая версия MongoDB 4.2.

Запрос на обновление данных:

db.collection.updateMany({ "FriendsList" : { $ne : [] }},[{$set :{FriendsList: '$FriendsList.UserId'}}])

Но если ваши FriendsList.UserId являются строками, лучше конвертировать их ObjectId() как показано ниже:

db.colleciton.updateMany({ "FriendsList" : { $ne : [] }},[{$set :{FriendsList: { $map: { input: '$FriendsList.UserId', in: {$toObjectId: '$$this'}} }}}])
Обновление существующей модели mon goose для ограничения будущих записей в БД:

Mon goose Модель:

Таким образом, FriendsList будет массивом ObjectId(), который будет ссылаться на другую новую схему через поле ref.

FriendsList:[{
      type: mongoose.Schema.Types.ObjectId,
      ref: "FriendList" /** 'FriendList' will be a mongoose schema refers to a collection */
}]

Ссылка: пн goose -популяция

0 голосов
/ 13 апреля 2020

Попробуйте использовать User модель

FriendsList:{
  type: mongoose.Schema.Types.ObjectId,
  ref: "FriendList"    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...