Php 在mongoDB中插入many()时添加时间戳

Php 在mongoDB中插入many()时添加时间戳,php,mongodb,Php,Mongodb,嗨,我是MySQL用户,是mongoDB的新手。 我从我的物联网设备获取以下数据: $body={ "key": "121239", "secrete": "Your_Device_Secrete", "data": [ { "Temperature":50, "Humidity":30, "Vibration":100, "Time":"2020-1-26 00:00:01" }, { "Tempe

嗨,我是MySQL用户,是mongoDB的新手。 我从我的物联网设备获取以下数据:

$body={
  "key": "121239",
  "secrete": "Your_Device_Secrete",
  "data": [
    {
      "Temperature":50,
      "Humidity":30,
      "Vibration":100,
      "Time":"2020-1-26 00:00:01"
    },
    {
      "Temperature":55,
      "Humidity":34,
      "Vibration":50,
      "Time":"2020-1-26 00:00:02"
    }
  ]
}
$this->mongo->batch_insert($body["key"],$body["data"]);
    {
        "Temperature": 50,
        "Humidity": 30,
        "Vibration": 100,
        "Time": "2020-1-26 00:00:01",
        "_id": {
            "$id": "5e330be3f7577f640d2a0922"
        }
    },
    {
        "Temperature": 55,
        "Humidity": 34,
        "Vibration": 50,
        "Time": "2020-1-26 00:00:02",
        "_id": {
            "$id": "5e330be3f7577f640d2a0923"
        }
    }
我使用PHP CodeIgnitor将其插入mongoDB,如下所示:

$body={
  "key": "121239",
  "secrete": "Your_Device_Secrete",
  "data": [
    {
      "Temperature":50,
      "Humidity":30,
      "Vibration":100,
      "Time":"2020-1-26 00:00:01"
    },
    {
      "Temperature":55,
      "Humidity":34,
      "Vibration":50,
      "Time":"2020-1-26 00:00:02"
    }
  ]
}
$this->mongo->batch_insert($body["key"],$body["data"]);
    {
        "Temperature": 50,
        "Humidity": 30,
        "Vibration": 100,
        "Time": "2020-1-26 00:00:01",
        "_id": {
            "$id": "5e330be3f7577f640d2a0922"
        }
    },
    {
        "Temperature": 55,
        "Humidity": 34,
        "Vibration": 50,
        "Time": "2020-1-26 00:00:02",
        "_id": {
            "$id": "5e330be3f7577f640d2a0923"
        }
    }
将数据插入名为给定键的集合中,如下所示:

$body={
  "key": "121239",
  "secrete": "Your_Device_Secrete",
  "data": [
    {
      "Temperature":50,
      "Humidity":30,
      "Vibration":100,
      "Time":"2020-1-26 00:00:01"
    },
    {
      "Temperature":55,
      "Humidity":34,
      "Vibration":50,
      "Time":"2020-1-26 00:00:02"
    }
  ]
}
$this->mongo->batch_insert($body["key"],$body["data"]);
    {
        "Temperature": 50,
        "Humidity": 30,
        "Vibration": 100,
        "Time": "2020-1-26 00:00:01",
        "_id": {
            "$id": "5e330be3f7577f640d2a0922"
        }
    },
    {
        "Temperature": 55,
        "Humidity": 34,
        "Vibration": 50,
        "Time": "2020-1-26 00:00:02",
        "_id": {
            "$id": "5e330be3f7577f640d2a0923"
        }
    }
现在我想为插入的每一行添加时间戳。我希望按如下方式插入数据:

{
        "Temperature": 50,
        "Humidity": 30,
        "Vibration": 100,
        "Time": "2020-1-26 00:00:01",
        "_id": {
            "$id": "5e330be3f7577f640d2a0922"
        },
        timestamp:<CURRUNT TIME>
    },
    {
        "Temperature": 55,
        "Humidity": 34,
        "Vibration": 50,
        "Time": "2020-1-26 00:00:02",
        "_id": {
            "$id": "5e330be3f7577f640d2a0923"
        },
        timestamp:<CURRUNT TIME>
    }
{
“温度”:50,
“湿度”:30,
“振动”:100,
“时间”:“2020-1-26 00:00:01”,
“_id”:{
$id:“5E330BE3F757F640D2A0922”
},
时间戳:
},
{
“温度”:55,
“湿度”:34,
“振动”:50,
“时间”:“2020-1-26 00:00:02”,
“_id”:{
$id:“5E330BE3F757F640D2A0923”
},
时间戳:
}

有没有办法让mongoDB像MySQL一样自动添加当前时间戳?

首先,您不应该将日期/时间值存储为字符串!这只会在以后产生麻烦。更好地利用

"Time": ISODate("2020-01-26T00:00:02Z")
“时间”:新日期(“2020-01-26 00:00:02”)
也可以工作

一般来说,您不需要插入时间戳。每个文档都会获得一个内部
\u id
标识符,该标识符还包含插入文档的时间。您可以这样尝试:

db.collection.aggregate([
  {
    $project: {
      timestamp: {
        $toDate: "$_id"
      },
      key: 1,
      secrete: 1,
      data: 1,
      _id: 0
    }
  }
])
$mongo->db->collection->insertOne([         
    "timestamp" => new MongoDB\BSON\UTCDateTime(NULL),
    "key" => "121239",
    "secrete" => "Your_Device_Secrete",
    "data" => [
        [
        "Temperature" => 50,
        "Humidity" => 30,
        "Vibration" => 100,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:01"))
        ],
        [
        "Temperature" => 55,
        "Humidity" => 34,
        "Vibration" => 50,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:02"))
        ]
    ]   
]); 
结果:

  {
    "data": [
      {
        "Humidity": 30,
        "Temperature": 50,
        "Time": "2018-02-26 01:00:00",
        "Vibration": 100
      },
      {
        "Humidity": 34,
        "Temperature": 55,
        "Time": "2018-02-26 01:00:00",
        "Vibration": 50
      }
    ],
    "key": "121239",
    "secrete": "Your_Device_Secrete",
    "timestamp": ISODate("2018-02-26T00:00:00Z")
  }
您也可以查询它,例如

db.collection.find({
  $expr: {
    $gte: [ {"$toDate": "$_id"}, ISODate("2020-01-03T11:00:00Z") ]
  }
})
然而,如果您想显式地插入时间戳,那么只需这样做

{
"Temperature": 50,
"Humidity": 30,
"Vibration": 100,
"_id": {
    "$id": "5e330be3f7577f640d2a0923"
},
"timestamp": new Date()
}
或者
“timestamp”:ISODate()
也应该起作用

另一个注意事项是,这个嵌入文档
“_id”:{“$id”:“5E330BE3F757F640D2A0923”}
看起来非常奇怪。我想这是一个bug。字符串看起来像用于
\u id
ObjectId
对象。不知怎的,你把它刮了

更新

我真的建议使用适当的数据类型。在PHP中,插入可以如下所示:

db.collection.aggregate([
  {
    $project: {
      timestamp: {
        $toDate: "$_id"
      },
      key: 1,
      secrete: 1,
      data: 1,
      _id: 0
    }
  }
])
$mongo->db->collection->insertOne([         
    "timestamp" => new MongoDB\BSON\UTCDateTime(NULL),
    "key" => "121239",
    "secrete" => "Your_Device_Secrete",
    "data" => [
        [
        "Temperature" => 50,
        "Humidity" => 30,
        "Vibration" => 100,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:01"))
        ],
        [
        "Temperature" => 55,
        "Humidity" => 34,
        "Vibration" => 50,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:02"))
        ]
    ]   
]); 

首先,不应将日期/时间值存储为字符串!这只会在以后产生麻烦。更好地利用

"Time": ISODate("2020-01-26T00:00:02Z")
“时间”:新日期(“2020-01-26 00:00:02”)
也可以工作

一般来说,您不需要插入时间戳。每个文档都会获得一个内部
\u id
标识符,该标识符还包含插入文档的时间。您可以这样尝试:

db.collection.aggregate([
  {
    $project: {
      timestamp: {
        $toDate: "$_id"
      },
      key: 1,
      secrete: 1,
      data: 1,
      _id: 0
    }
  }
])
$mongo->db->collection->insertOne([         
    "timestamp" => new MongoDB\BSON\UTCDateTime(NULL),
    "key" => "121239",
    "secrete" => "Your_Device_Secrete",
    "data" => [
        [
        "Temperature" => 50,
        "Humidity" => 30,
        "Vibration" => 100,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:01"))
        ],
        [
        "Temperature" => 55,
        "Humidity" => 34,
        "Vibration" => 50,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:02"))
        ]
    ]   
]); 
结果:

  {
    "data": [
      {
        "Humidity": 30,
        "Temperature": 50,
        "Time": "2018-02-26 01:00:00",
        "Vibration": 100
      },
      {
        "Humidity": 34,
        "Temperature": 55,
        "Time": "2018-02-26 01:00:00",
        "Vibration": 50
      }
    ],
    "key": "121239",
    "secrete": "Your_Device_Secrete",
    "timestamp": ISODate("2018-02-26T00:00:00Z")
  }
您也可以查询它,例如

db.collection.find({
  $expr: {
    $gte: [ {"$toDate": "$_id"}, ISODate("2020-01-03T11:00:00Z") ]
  }
})
然而,如果您想显式地插入时间戳,那么只需这样做

{
"Temperature": 50,
"Humidity": 30,
"Vibration": 100,
"_id": {
    "$id": "5e330be3f7577f640d2a0923"
},
"timestamp": new Date()
}
或者
“timestamp”:ISODate()
也应该起作用

另一个注意事项是,这个嵌入文档
“_id”:{“$id”:“5E330BE3F757F640D2A0923”}
看起来非常奇怪。我想这是一个bug。字符串看起来像用于
\u id
ObjectId
对象。不知怎的,你把它刮了

更新

我真的建议使用适当的数据类型。在PHP中,插入可以如下所示:

db.collection.aggregate([
  {
    $project: {
      timestamp: {
        $toDate: "$_id"
      },
      key: 1,
      secrete: 1,
      data: 1,
      _id: 0
    }
  }
])
$mongo->db->collection->insertOne([         
    "timestamp" => new MongoDB\BSON\UTCDateTime(NULL),
    "key" => "121239",
    "secrete" => "Your_Device_Secrete",
    "data" => [
        [
        "Temperature" => 50,
        "Humidity" => 30,
        "Vibration" => 100,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:01"))
        ],
        [
        "Temperature" => 55,
        "Humidity" => 34,
        "Vibration" => 50,
        "Time" => new MongoDB\BSON\UTCDateTime(new DateTime("2020-1-26 00:00:02"))
        ]
    ]   
]); 

在我的物联网课程中,从DHT11传感器读取传感器值时,我也有与您类似的要求。我能够将所有的温度和湿度读数插入MongoDB,但后来在绘制图表时,我意识到我也需要时间戳。经过一段时间的研究,我提出了这个问题。但是,它将在数据库中创建一个新集合。 这里,新的集合名称是dht11传感器读数

有关更多信息,请参阅。
db.collection.aggregate([
{
$addFields:{时间戳:{$toDate:$\u id}
}
}, 
{$out:“dht11传感器读数”
}

])
在我的物联网类中从DHT11传感器读取传感器值时,我也有与您类似的要求。我能够将所有的温度和湿度读数插入MongoDB,但后来在绘制图表时,我意识到我也需要时间戳。经过一段时间的研究,我提出了这个问题。但是,它将在数据库中创建一个新集合。 这里,新的集合名称是dht11传感器读数

有关更多信息,请参阅。
db.collection.aggregate([
{
$addFields:{时间戳:{$toDate:$\u id}
}
}, 
{$out:“dht11传感器读数”
}

])
您检查过这个吗?你检查过这个了吗+1用于推荐ISODate()。很多时候,人们用字符串表示日期和时间。由于i18n和/或格式问题,难以进行计算。顺便说一句,MongoDB BSON类型将时间戳和日期(ISODate)区分为两种不同的数据类型。时间戳在内部用于通过oplog进行复制。我的问题是我从IOT端获取的数据是字符串格式的json。我可以在php数组中转换它,然后将它传递给insert\u batch方法以插入mongoDB。我不想遍历我的数据数组并将所有时间数据转换为时间对象。在mySQL中,如果我将字符串数据发送到数据类型为timestamp的字段,默认情况下,它会将其转换为timestamp。所以我在mongoDB中寻找类似的东西。是否有一种方法可以定义所有在时间字段中发送的数据都应该转换并存储为datetimeobject@barrypicker是的,但我假设TO希望插入当前
日期
值,而不是内部MongoDB当前
时间戳
值。“时间戳”只是“当前日期/时间”的一个常用短语是的,谢谢你的帮助,我是用你的ans+1推荐ISODate()解决的。很多时候,人们用字符串表示日期和时间。由于i18n和/或格式问题,难以进行计算。顺便说一句,MongoDB BSON类型将时间戳和日期(ISODate)区分为两种不同的数据类型。时间戳在内部用于通过oplog进行复制。我的问题是我从IOT端获取的数据是字符串格式的json。我可以在php数组中转换它,然后将它传递给insert\u batch方法以插入mongoDB。我不想遍历我的数据数组并将所有时间数据转换为时间对象。在mySQL中,如果我将字符串数据发送到数据类型为timestamp的字段,默认情况下,它会将其转换为timestamp。所以我是罗