Как вставить хэш-карту в документ MongoDB?

#node.js #mongodb

#node.js #mongodb

Вопрос:

Я пытаюсь структурировать список друзей с помощью MongoDB.

Вот как я в настоящее время структурирую его:

 {
    "_id": {
        "$oid": "601c570da04b75fabcd2705d"
    },
    "user_id": 1,
    "friendslist": {
         3 : true
     }
}
 

Как я могу создать запрос, который помещает в мою хэш-карту ( "friendslist" это хэш-карта), а ключ равен 3 для идентификатора друга, а флаг true — для статуса ожидающего запроса на добавление в друзья. (Значение True означает, что они друзья, а false будет ожидающим запроса на добавление в друзья)

Это то, что у меня сейчас есть:

 const upsertFriendId = db.collection('friends')
        .updateOne(
            { user_id: userId },
            { $set: { ???? : ????} },
            { upsert: true }
        );
 

Я не могу понять синтаксис, который мне нужно вставить в $set объект.

Комментарии:

1. Какое значение вы хотели бы установить?

2. Я хочу обновить хэш-карту «список друзей». Если есть пользователь с идентификатором 3, ничего не делайте, иначе создайте put хэш-карту, чтобы добавить нового пользователя { friend_id : true }

Ответ №1:

Чтобы убедиться, что вы не переопределяете остальные ключи внутри friendlist , вы можете выполнить обновление, например

 const mongoFriendKey = `friendlist.${/* FRIEND_ID_VARIABLE_GOES_HERE */}`;

const upsertFriendId = db.collection('friends')
        .updateOne(
            {
               user_id: userId
            },
            {
               $set: 
                 {
                    [mongoFriendKey] : true
                 }
            },
            { upsert: true }
        );
 

В приведенном выше замените /* FRIEND_ID_VARIABLE_GOES_HERE */ на переменную friend id . При этом запрос будет искать друга с этим конкретным идентификатором, а затем попытается установить его true , если не найден, без переопределения всего friendlist вашего объекта.

Кроме того, я надеюсь, вы знаете, что делает upsert, если обновление не найдет документ, тогда оно в конечном итоге вставит его.

Комментарии:

1. Я получаю синтаксическую ошибку: i.imgur.com/fsfBZYd.png создает ли это также новую карту, если она не существует?

2. @DIRTYDAVE он добавит идентификатор друга в объект obj, если он не существует, и установит для него значение true

3. Моя ошибка с синтаксической ошибкой, дайте мне минуту, пожалуйста

4. Это выдает мне синтаксическую ошибку, когда я использую ` ` — «Неожиданная строка шаблона». Когда я переключаюсь на одинарные кавычки вместо ‘friendlist. $ {FriendID}’, это выдает мне другую ошибку: поле с префиксом доллара ($) ‘$ {FriendID}’ в ‘friendlist.$ {FriendID}’ недопустимо для хранения.

5. Отлично, спасибо! Я не думал делать это таким образом, я думал, что мне понадобится объект hashmap, но, думаю, я этого не делаю