MongoDB/mongosh,我如何将时间戳作为格式化字符串插入?

fkaflof6  于 2022-12-18  发布在  Go
关注(0)|答案(1)|浏览(117)

用蒙戈做实验。
在创建文档时,我想给文档添加一个时间戳。2原则上如下所示:

db.test3.users.insertOne(
  {
    name: "Bob",
    timestamp: new Date()
  }
);

db.test3.users.find({_id :ObjectId("639c8084d33ebcebf19ad4a2")})
[
  {
    _id: ObjectId("639c8084d33ebcebf19ad4a2"),
    name: 'Bob',
    timestamp: ISODate("2022-12-16T14:28:20.449Z")
  }
]

但现在我想把它作为一个特定格式的字符串插入,Co-pilot建议如下:

db.test3.users.insertOne({
        name: "Bob",
        timestamp: {
              $dateToString: {
                format: "%Y-%m-%d %H:%M:%S.%L",
                date: new Date()
                }
            }
        })

但这不起作用,它只是将命令保存为值,而不是“执行”命令:

db.test3.users.find({_id :ObjectId("639c8173d33ebcebf19ad4a3")})
[
  {
    _id: ObjectId("639c8173d33ebcebf19ad4a3"),
    name: 'Bob',
    timestamp: {
      '$dateToString': {
        format: '%Y-%m-%d %H:%M:%S.%L',
        date: ISODate("2022-12-16T14:32:19.333Z")
      }
    }
  }
]


我显然漏掉了什么。请告知

eimct9ow

eimct9ow1#

如果要将字符串插入数据库,则应传入包含所需字段的字符串值的文档。例如:

> db.test3.users.insertOne({
  name: "Bob",
  timestamp: (new Date()).toString()
});
{
  acknowledged: true,
  insertedId: ObjectId("639c88130ba9e22104ea9213")
}

> db.test3.users.find()
[
  {
    _id: ObjectId("639c88130ba9e22104ea9213"),
    name: 'Bob',
    timestamp: 'Fri Dec 16 2022 09:00:35 GMT-0600 (Central Standard Time)'
  }
]

还有几点需要指出。首先,Co-pilot基本上是试图向您展示如何在数据库中 * 将日期转换为字符串。例如,在从集合读取数据的聚合过程中,我们添加了一个字段,该字段具有日期的字符串表示形式:

> db.foo.find()
[ { _id: 1 } ]
test> db.foo.aggregate([
  {
    '$addFields': {
      timestamp: {
        '$dateToString': {
          format: '%Y-%m-%d %H:%M:%S.%L',
          date: ISODate("2022-12-16T14:32:19.333Z")
        }
      }
    }
  }
])
[ { _id: 1, timestamp: '2022-12-16 14:32:19.333' } ]

同样,可以使用the $dateToString operator转换现有数据:

> db.foo.find()
[ 
  { _id: 1, timestamp: ISODate("2022-12-16T15:06:30.881Z") } 
]

> db.foo.aggregate([{ $addFields: { timestamp: { '$dateToString': { format: '%Y-%m-%d %H:%M:%S.%L', date: "$timestamp" } } } }])
[ 
  { _id: 1, timestamp: '2022-12-16 15:06:30.881' } 
]

> db.foo.aggregate([{ $addFields: { stringtimestamp: { '$dateToString': { format: '%Y-%m-%d %H:%M:%S.%L', date: "$timestamp" } } } }])
[
  {
    _id: 1,
    timestamp: ISODate("2022-12-16T15:06:30.881Z"),
    stringtimestamp: '2022-12-16 15:06:30.881'
  }
]


我前面的命令在将文档发送到数据库之前在Javascript中“客户端”进行字符串转换。
另一件需要注意的事情是db.test3.users不是标准命名,特别是这会导致test3.users成为集合名称,它会单独附加一些额外的数据库名称,例如:

> db.test3.users
test.test3.users

这并不是说你不能这样做,只是大多数时候集合名称是一个单词。
编辑:第三件我忘记提到的事情是,将日期存储为字符串通常不是最佳实践,以这种格式查询它们通常不够灵活或高效。

相关问题