2016-06-21 63 views
3
{ 
    "_id" : ObjectId("57693a852956d5301b348a99"), 
    "First_Name" : "Sri Ram", 
    "Last_Name" : "Bandi", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Class" : "facebook", 
      "ID" : "1778142655749042", 
      "Login_Time" : ISODate("2016-06-21T13:00:53.867Z"), 
      "Logout_Time" : ISODate("2016-06-21T13:01:04.640Z"), 
      "Duration" : null 
     } 
    ], 
    "Count" : 1 
} 

这是我的mongo数据。我想将duration设置为登录和注销时间的差异。所以,我执行以下查询:Mongodb在时间上的差异正在返回当前时间

db.sessionData.update(
    { "Sessions.ID": "1778142655749042"}, 
    { $set: { 
     "Sessions.$.Duration": ISODate("Sessions.$.Logout_Time" - "Sessions.$.Login_Time") 
     } 
    } 
) 

但我得到的结果是:

{ 
    "_id" : ObjectId("57693a852956d5301b348a99"), 
    "First_Name" : "Sri Ram", 
    "Last_Name" : "Bandi", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Class" : "facebook", 
      "ID" : "1778142655749042", 
      "Login_Time" : ISODate("2016-06-21T13:00:53.867Z"), 
      "Logout_Time" : ISODate("2016-06-21T13:01:04.640Z"), 
      "Duration" : ISODate("2016-06-21T13:02:58.010Z") 
     } 
    ], 
    "Count" : 1 
} 

和持续时间赤身设置为当前时间/日期,而不是差异。

+2

怎么可能u上日期进行算术运算? –

+0

那么如何获得差异? –

回答

1

你可以使用聚合框架使用$divide$subtract运营商给你在几秒钟之差为时间做算术运算。该公式是由

Duration (sec) = (Logout_Time - Login_Time)/1000 

聚集管道给应该给你有这个计算值一个新的领域,然后你可以使用在aggregate()结果forEach()光标方法循环的结果的文件并更新收藏。

以下示例显示了这一点:

db.sessionData.aggregate([ 
    { "$match": { "Sessions.ID" : "1778142655749042" } }, 
    { "$unwind": "$Sessions" }, 
    { "$match": { "Sessions.ID" : "1778142655749042" } }, 
    { 
     "$project": { 
      "Duration": { 
       "$divide": [ 
        { "$subtract": [ "$Sessions.Logout_Time", "$Sessions.Login_Time" ] }, 
        1000 
       ] 
      } 
     } 
    } 
]).forEach(function (doc) { 
    db.sessionData.update(
     { "Sessions.ID": "1778142655749042", "_id": doc._id }, 
     { 
      "$set": { "Sessions.$.Duration": doc.Duration } 
     } 
    ); 
}); 

查询结果

{ 
    "_id" : ObjectId("57693a852956d5301b348a99"), 
    "First_Name" : "Sri Ram", 
    "Last_Name" : "Bandi", 
    "Email" : "[email protected]", 
    "Sessions" : [ 
     { 
      "Class" : "facebook", 
      "ID" : "1778142655749042", 
      "Login_Time" : ISODate("2016-06-21T13:00:53.867Z"), 
      "Logout_Time" : ISODate("2016-06-21T13:01:04.640Z"), 
      "Duration" : 10.773 
     } 
    ], 
    "Count" : 1 
} 
+1

这工作! thnku :) :) –

+0

你可以提供查询,如果注销时间为空,并且我希望它作为当前时间并同时获取持续时间..所以匹配标准将在哪里会话。 id是1778142655749042,注销时间为空 –

+0

这完全是一个新问题,请考虑为此创建一个。 – chridam

相关问题