Выполнение очистки данных в Mongodb - PullRequest
6 голосов
/ 11 марта 2020

Мое приложение отслеживает движение данных по всей системе. Когда движение записывается, оно помещается в отдельную коллекцию, которая определяет, является ли документ действующим, доступным или не обслуживаемым. Я использовал $ addToSet для размещения _id и $ pullAll, чтобы убедиться, что при перемещении do c из enroute в доступное оно не дублируется. Но когда _id полностью перемещается в новое место, мне нужно удалить старые данные из старого места и вставить их в новое место. Вставка работает, но я не могу понять, как правильно удалить данные из старого местоположения. Это все в Метеорных Звонках и Монгодб

          if last.status is "Enroute"
            LastLocation.update locationId: last.locationId,partId: last.partId,
                $addToSet:
                    enroutePurchaseIds: lastPurchaseId
                $pullAll:
                    availiblePurchaseIds: lastPurchaseId
                    outOfServicePurchaseIds: lastPurchaseId

Ответы [ 2 ]

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

Обновление

Вы можете запустить команду слияния из следующей версии 4.4, которая позволяет обновить ту же коллекцию, на которой выполняется агрегация. Передать массив как старое местоположение и новое местоположение

db.collection.aggregate([
  {"$match":{"location":{"$in":[oldLocation,newLocation]}}},
  {"$addFields":{"sortOrder":{"$indexOfArray":[[oldLocation,newLocation],"$location"]}}},
  {"$sort":{"sortOrder":1}},
  {"$group":{
    "_id":null,
    "oldLocationDoc":{"$first":"$$ROOT"},
    "newLocationDoc":{"$last":"$$ROOT"}
  }},
  {"$addFields":{
    "oldLocationDoc.old":{
      "$filter":{
        "input":"$oldLocationDoc.old",
        "cond":{"$ne":["$$this",oldLocation]}
      }
    },
    "newLocationDoc.new":{"$concatArrays":["$newLocationDoc.new",[newLocation]]}
  }},
  {"$project":{"locations":["$oldLocationDoc","$newLocationDoc"]}},
  {"$unwind":"$locations"},
  {"$replaceRoot":{"newRoot":"$locations"}},
  {"$merge":{
    "into":{"db":"db","coll":"collection"},
    "on":"_id",
    "whenMatched":"merge",
    "whenNotMatched":"failed"
  }}
]

Оригинал

Невозможно переместить значение массива / поля из одного документа в другой документ в одной операции обновления .

Вы можете использовать transactions для выполнения многодокументных обновлений в режиме атоми c. Требуется набор реплик.

var session = db.getMongo().startSession();
var collection = session.getDatabase('test').getCollection('collection');
session.startTransaction({readConcern: {level:'snapshot'},writeConcern: {w:'majority'}});
collection.update({location:oldLocation},{$pull:{availiblePurchaseIds:lastPurchaseId}});
collection.update({location:newLocation},{$push:{enroutePurchaseIds:lastPurchaseId}});
session.commitTransaction()
session.endSession()

Другие варианты могут включать bulk обновления в случае автономного экземпляра mongod.

var bulk = db.getCollection('collection').initializeUnorderedBulkOp();
bulk.find({location:oldLocation}).updateOne({$pull:{availiblePurchaseIds:lastPurchaseId}});
bulk.find({location:newLocation}).updateOne({$push:{enroutePurchaseIds:lastPurchaseId}});  
bulk.execute();
0 голосов
/ 12 марта 2020

Вы перемещаете весь документ из одной коллекции в другую или просто перемещаете идентификатор документа? Я ничего не могу поделать с coffeescript, но если вы хотите переместить целые документы, вам может пригодиться следующий поток:

mongodb переместить документы из одной коллекции в другую коллекцию

...