2013-05-08 1 views
0

Мне нужно создать отметку времени в моей коллекции mongodb. Я использую C# в передний конец .my код:Как сделать разметку временной отметки для вставки и обновления записи в монго?

 internal static void CreateStudent(string Id, string Name,string strUserId) 
     { 
      MongoServer server = MongoServer.Create(ConnectionString); 
      MongoDatabase mydb = server.GetDatabase("Database"); 

      MongoCollection<BsonDocument> Student = mydb.GetCollection<BsonDocument>("Student"); 
      BsonDocument colectionGenre = new BsonDocument { 
         { "Code", Id }, //Id is Auto Generated in sql. Fetch from there using Output parameter and save it in one variable and pass that here 
         { "Name", Name }, 
         { "Status","Y"}, 
        {"stamps" , new BsonDocument { 
         {"Ins_date", DateTime.Now}, 
         {"up_date",""}, 
         {"createUsr", strUserId}, 
         {"updUsr", ""}, 
         {"Ins_Ip", GetIP()}, 
         {"Upd_IP",""}}} 
         }; 
      Student.Insert(colectionGenre); 
     } 

     internal static void UpdateStudent(string Id, string Name,string strUserId) 
     { 
      MongoServer server = MongoServer.Create(ConnectionString); 
      MongoDatabase mydb = server.GetDatabase("Database"); 

      MongoCollection<BsonDocument>Student = mydb.GetCollection<BsonDocument>("Student"); ; 
      // Query for fetch the ID which is edited by the User...(user can only able to edit the NAME field alone) 
      var query = new QueryDocument { 
        { "Code", Id }}; 
      // After Fetch the correspondent ID it updates the name with the Edited one 
      var update = new UpdateDocument { 
        { "$set", new BsonDocument("Name", Name) } 
          }; 
      // Updated Query.(Id is same as previous. Name is updated with new one) 
      {"stamps" , new BsonDocument { 

         {"up_date",DateTime.Now}, 
         {"updUsr", strUserId}, 
         {"Upd_IP",GetIp()}}} 
         }} 
     }; 
     Student.Update(query,update,UpdateFlags.Upsert, SafeMode.True); 
    } 

Он отлично подходит для метода ВСТАВИТЬ работает со временем (Stamp), как только создается запись. Но проблема заключается в методе обновления. Когда обновление пользователь что-то время вставки также изменяется с обновленным временем ..

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

{ 
"_id" : ObjectId("5178aea4e6d8e401e8e51dc0"), 
"Code": 12, 
"Name": Sname, 
"Stamps:"{ 
"Ins_date":03:34:00, 
"up_date": 04:35:12 
} 
} 

Но моя проблема как раз будет то же самое после того, как Обновить. Это потому, что он принимает текущую функцию даты и времени. Как я могу достичь вышеуказанного выхода. Ему нужен любой драйвер. Что-то для меня ...

+1

Почему вы устанавливаете значение даты вставки, когда говорите, что не хотите, чтобы он был изменен? Обновление сливается с существующим документом и не заменяет его. – WiredPrairie

+0

Вы используете флаг upsert? Я не вижу его в коде, но похоже, что вы не знаете, будет ли запись обновляться или вставляться? –

+0

@ AsyaKamsky Я пробовал с подобным образом (Upset flag UpdateFlags.Upsert, SafeMode.True) .. Но он остается таким же. – Aarthi

ответ

0

Наконец я получил ответ ... В методе ВСТАВИТЬ просто передать ниже вещи

{"Insert-stamps" , new BsonDocument { 
     {"Ins_date", DateTime.Now}, 
     {"createUsr", strUserId}, 
     {"Ins_Ip", GetIP()}}}, 
    {"Update-stamps" , new BsonDocument { 
     {"up_date",""}, 
     {"updUsr", ""}, 
     {"Upd_IP",""}}} 

И В методе UPDATE

{"Update-stamps" , new BsonDocument { 
     {"up_date", DateTime.Now}, 
     {"updUsr", StrUserId}, 
     {"Upd_IP",GetIP()}}} 

Он отлично работает мой стандарт ....

+0

Спасибо всем, кто помогает мне решить эту проблему ... – Aarthi

0

Вы передаете значение для поля Ins_date, когда вы «Обновление документа. Просто удалите это из документа обновления и он не изменит его.

var update = new UpdateDocument { 
    {"$set", new BsonDocument { 
     {"State_strName", name}, 
     {"stamps" , new BsonDocument { 
      {"up_date",DateTime.Now}, 
      {"createUsr", ""}, 
      {"updUsr", ""}, 
      {"Ins_Ip", GetIP()}, 
      {"Upd_IP",GetIP()}}}    
     }; 
    tblmytbl.Update(query, update); 
+0

Когда я удаляю поле вставки, это означает, что время вставки я не могу туда добраться .. только время обновления будет там. Мне нужно время – Aarthi

+0

@ Aarthi не удаляет поле времени вставки. Просто измените ur обновленное время при обновлении. – sachin

+0

Я передаю этот код на основании условия. когда user id = "401", он проверяет условие, если значение отсутствует, означает, что он переходит в инструкцию insert. поэтому я делаю up_date "," в первый раз. Если значение 401 присутствует, оно переходит к обновлению части. – Aarthi

0

Как вы обновляете значение в существующем документе, используя уникальный идентификатор или другой уникальный value.Check ли уникальный идентификатор или значение уже существует в базе данных documents.If она существует средство изменения времени обновления только ничего не делайте.

+0

это Ответ такой же, как ответ @matthewtole. Но я думаю, что это поможет вам понять предыдущий ответ. – sachin

+0

Я передаю этот код на основе условия. когда user id = "401", он проверяет условие, если значение отсутствует, означает, что он переходит в инструкцию insert. поэтому я делаю up_date "," в первый раз. Если значение 401 присутствует, оно переходит к обновлению части. Поэтому, когда часть updat выполняет, значит, я не смогу получить время вставки здесь. – Aarthi

+0

@Aarthi Когда часть обновления ur будет выполняться, если u уже вставил документ. Так что не проблема. – sachin

0

При обновлении данных в mongoDB вы передаете те же значения для Ins_date и up_date, что и DateTime.Now (текущая системная дата и время). Такие же значения обновляются в вашем monoDB документ.

Для этого вы можете сделать одну вещь: - Перед обновлением документа MongoDB вы берете Ins_date значения из базы данных с помощью SQL-запроса в C# .net, а затем использовать это значение для Ins_date и up_date использовать DateTime.Now, то ваш оба значения будут разными.

var update = new UpdateDocument { 
     {"$set", new BsonDocument { 
      {"State_strName", name}, 
      {"stamps" , new BsonDocument { 
       {"Ins_date", **Ins_date values_from your database**} , 
       {"up_date",DateTime.Now}, 
       {"createUsr", ""}, 
       {"updUsr", ""}, 
       {"Ins_Ip", GetIP()}, 
       {"Upd_IP",GetIP()}}}    
      }; 
     tblmytbl.Update(query, update); 
0

Похоже, что вам нужно, это новый $setOnInsert оператор, который был добавлен в версии 2.4 именно для этого случая использования.

Когда обновление с флагом upsert приводит к вставке, вы хотите установить $ insert_date в Date.now, но когда это регулярное обновление, вы не хотите устанавливать его вообще. Итак, теперь с вашим обновлением вы должны использовать $set для обычных полей, которые вы хотите установить, является ли это обновлением или вставкой, но используйте $setOnInsert для полей, которые должны быть установлены только во время вставки.

+0

@ Asya Kamshy Я не могу установить флаг упоминания в моем коде .. он вызывает ошибку – Aarthi

+0

Можете ли вы быть более конкретным? Какой флаг? Какая ошибка? $ setOnInsert не является флагом, это оператор, например $ set –