Как я могу клонировать объекты, не извлекая их из MongoDb?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу клонировать объекты, не извлекая их из MongoDb?

Сообщение Anonymous »

Я новичок в MongoDb, у меня довольно простой вопрос, и я думаю, что нашел решение, но хочу знать, есть ли лучший способ.
Я использую MongoDb в C#. Ниже показан объект, который я хочу клонировать, но также хочу объединить его в одну коллекцию.
Это упрощенная версия документа, который я использую:

Код: Выделить всё

class MyDocument
{
public ObjectId Id { get; set; } // my object id. see my question below, type can change
public string MyDocId { get; set; }
public int ContainerId { get; set; } // child of owner so linked
public string OwnerId { get; set; } // this is guid but stored as string for mongodb
}
Объект уникален
  • только по идентификатору
  • комбинации OwnerId + MyDocId + ContainerId, поэтому допустимыми примерами являются («12AF», «John», 1), («12AF», «Anna», 1), («12AF», «John», 2), («34AF», «Джон», 2) и так далее, но я не могу добавить еще один («12AF», «Джон», 1), потому что он уже существует.
Я хочу клонировать все OwnerId+ContainerId 12AF+1 и в 12AF+3. В моем примере я хочу получить:

Код: Выделить всё

("12AF", "John", 1)
("12AF", "Anna", 1)
("12AF", "John", 2)
("34AF", "John", 2)
("12AF", "John", 3)
("12AF", "Anna", 3)
Я думаю, что смогу сделать это с помощью операторов агрегирования и слияния, без проблем.
Мой актуальный вопрос здесь: я действительно хочу иметь другое поле Id. Предполагается, что это строка, и она будет такой, как показано здесь: (Id, OwnerId, MyDocId, ContainerId) в формате

Код: Выделить всё

("12AF\\1:John", "12AF", "John", 1)
("12AF\\1:Anna", "12AF", "Anna", 1)
("12AF\\2:John", "12AF", "John", 2)
("34AF\\2:John", "34AF", "John", 2)
Представьте, что я хочу сделать: клонирование объектов контейнера 1 (владелец 12AF) в контейнер 3, поэтому мне также нужно обновить поля ID, как показано здесь:

Код: Выделить всё

("12AF\\1:John", "12AF", "John", 1)
("12AF\\1:Anna", "12AF", "Anna", 1)
("12AF\\2:John", "12AF", "John", 2)
("34AF\\2:John", "34AF", "John", 2)
("12AF\\3:John", "12AF", "John", 3)
("12AF\\3:Anna", "12AF", "Anna", 3)
Возможно ли это без загрузки всех объектов в мое приложение? (загрузите их в память приложения, выполните итерацию для обновления каждого поля идентификатора, а затем вставьте снова. это не то, что я хочу)
Мне бы очень хотелось иметь это поле идентификатора, подобное этому, для поиска в другом приложении, где поля идентификатора установлены в этом формате. Если я смогу решить эту проблему, идентификаторы обоих приложений будут совпадать. Я не могу изменить другое приложение, поэтому я привязан к своей модели документа.
Спасибо
В SQL это очень просто, потому что мы можем использовать конкатенацию строк, как показано здесь, просто чтобы дать представление. Я хочу повторить это с помощью MongoDb.

Код: Выделить всё

INSERT INTO MT_TABLE (Id, MyDocId, ContainerId, OwnerId)
SELECT
OwnerId + '\\' + @newContainerId + ':' + MyDocId,
MyDocId, @newContainerId, OwnerId
FROM
MT_TABLE
WHERE
ContainerId = @oldContainerId AND OwnerId = @ownerId
РЕДАКТИРОВАТЬ: по какой-то причине я действительно не могу добавить комментарий в stackoverflow, поэтому пишу здесь. ни один из моих браузеров не работает, нажатие кнопки ничего не дает
Я использовал $aggregate, чтобы добиться того, чего хочу. в конвейере использовались $match, $set (я проверяю оператор $concat, чтобы убедиться, что он работает) и $merge. Мне нужно больше проверить «whenMatched» и «whenNotMatched», но, похоже, на данный момент это работает достаточно хорошо. Я пропустил изменение идентификатора на другой тип из-за других сложностей, я буду использовать $addFields.
если я смогу заставить его работать так, как я просил, я опубликую решение здесь
спасибо всем за ваши комментарии и отзывы

Подробнее здесь: https://stackoverflow.com/questions/798 ... in-mongodb
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»