【问题标题】:MongoDB Add custom field on insert OR JSON add custom key:valueMongoDB 在插入时添加自定义字段或 JSON 添加自定义键:值
【发布时间】:2017-09-03 21:37:15
【问题描述】:

喂!

长话短说。

我正在使用什么:

  • node.js
  • MongoDB
  • 猫鼬

有没有办法在插入时向 mongo 集合添加自定义字段?

我每 30 分钟通过 JSON 文件插入一些数据量(~35Mb 没什么大不了的),我想为一次插入的每个文档添加一个静态的自定义字段。

(实际上这是一个已经由另一个服务器生成的时间戳,不幸的是 mongodb 已经为它自己的内部使用保留了“时间戳”,所以这就是我在这里的原因)

我的代码看起来像这样

...
var toomuchJSONdata = [{
    "name":"John",
    "age":30,
 }
 {
    "name":"Carl",
    "age":25,
}{
    "....":"....",
    "....":"....",
}];
...
to-my.collection.insertMany(toomuchJSONdata)
...

那么解决我的问题的最佳/最简单的方法是什么?或者我走错了方向,为每个 JSON 对象添加自定义“键”:“值”更容易更好?喜欢:

 var toomuchJSONdata = [{
 "name":"John",
 "age":30,
 "customkey":"customvalue"   
 }

顺便说一句,在 Mongo 中以日期或时间戳的形式存储数据更好吗? (我想存储它,因为我将来需要 $aggregate 数据) 我已经做了什么(..还在做):

  • 使用 .insert 和 mongoose.model 进行实验
  • 忽略了 mongoose/mongodb/native-mongodb-for node.js 的文档
  • 我已经在 google 编码 3 个多小时了,但仍然无法解决我的问题。

【问题讨论】:

  • 您可以发布您所做的尝试吗?到目前为止,我看到的只是 JSON 数据,而不是您尝试将其放入数据库的尝试。添加一个字段非常简单,所以我不确定是什么让你没有看到它。
  • 实际上我已经尝试过这样的事情:to-my.collection.insertMany(toomuchJSONdata,[{"key":"value") //通过猫鼬和各种不同的驱动器以各种不同的方法。代码可以正常工作并且可以很好地插入工作。我知道添加自定义字段对于 stackoverflow 问题来说并不是什么大问题。但我只需要对集合中所有已在某一时刻插入的文档执行此操作。不幸的是,我发现只有 docs 可以使所有收集的文档都可以做到这一点,但不是我最近插入的所有文档
  • 这对您有帮助吗? db.collection.updateMany()$set
  • 我发现并且现在已经在工作的唯一“hack”是重命名一个不必要的字段并将我的“时间戳”数据插入其中。你是绝对正确的,问题不在 mongo 中,更多的是关于这里的 JSON。该文件总是每 30 分钟更改一次,所以我什至不知道下一次将导入多少文档(字符串)(就是这样我无法通过 _id 解决这个问题)
  • 为什么不直接转换内存中的对象呢?在进行 updatemany 之前,使用 Array.map 创建包含添加字段的新文档集合?

标签: javascript json node.js mongodb mongoose


【解决方案1】:

TL:DR 在我的情况下,我用这段代码解决了这个问题,它在将 JSON 数据插入到 MongoDB 之前修改了我的 JSON 数据:

var jsonObject = JSON.parse(body).files;
    var ts = (jsonObject[0].lastModified); //form timestamp TODO if ts updated too long reresh timer for query
    if (error) {
        console.log(error);
    }
    else {
        request(jsonObject[0].url, function(error, response, body){
            var MarketData = JSON.parse(body).auctions;
            MarketData.map(function (MarketData) {
                MarketData.lastModified = ts;
            });

感谢@Paul@stackoverYC 对我的启发。

我不能只通过 mongoose(或其他 mongodb 驱动程序)使用 $aggregate 的原因是因为 mongodb 已经为它自己的“内部使用”保留了“timestamp”字段。所以我称我的新领域为“lastModified”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多