【问题标题】:How to add an extra element in every nested array of a MongoDB object?如何在 MongoDB 对象的每个嵌套数组中添加一个额外的元素?
【发布时间】:2015-05-09 03:15:02
【问题描述】:

我有一个这样的 MongoDB 对象:

[ 
   { poster_ip: '127.0.0.1',
    post_body: 'example',
    _id: 54fc1f7808bac08f6d25f24b,
    __v: 0 },

  { poster_ip: '127.0.0.1',
    post_body: 'example',
    _id: 54fc1f7808bac08f6d25f24a,
    __v: 0 } 
]

如何向每个嵌套数组添加一个额外的元素,这样它会是这样的:

[ 
   { poster_ip: '127.0.0.1',
    post_body: 'example',
    _id: 54fc1f7808bac08f6d25f24a,
    __v: 0,
    newName: NewValue },

  { poster_ip: '127.0.0.1',
    post_body: 'example',
    _id: 54fc1f7808bac08f6d25f24b,
    __v: 0,
    newName: NewValue },
]

我试过了,但没用:

for(var i=0; i<JSONobject.length; i++){
    JSONobject[i].newName= NewValue;
}

我正在使用 node.js,对象是我从 mongodb 查询中得到的结果。

函数如下:

exports.Posts = function(UserID, PostID, callback) {

                Post.find( { post: PostID } , function(err, results) {

                var r = results.toObject(); //here i get error 'has no method toObject'

                for (var i=0; i<r.length; i++){
                    r[i].newName = "NewValue";
                }

                console.log(r);
                    //i don't see any changes here with console.log

                    return callback(null, results);
                });
}

编辑:

经过一番研究,我发现返回的 Mongoose 文档不是 JSON 对象,所以我现在尝试将其转换为对象。

【问题讨论】:

  • 基于JSONobject.length迭代并改变results[i]?
  • 存在严重的语义问题,使您难以关注。 JSONobject 是 Javascript 数组吗?是您在问题中首先写的文字吗?那么results 是什么?
  • 您发布的 for 循环看起来不错。是什么让您认为它不起作用?
  • @Pointy 它不起作用,因为我在循环后检查了结果。
  • @dystroy 哦,抱歉,之前的“结果”是 JSON 对象。我相信这是一个 javascript 数组,如果我错了,请纠正我。

标签: javascript json node.js mongodb object


【解决方案1】:

我不确定为什么 for 循环会在这里失败,因为我觉得这很好。但是试试这个:

results = results.map(function(item) {
    item.newName = "NewValue";
    return item;
});

这将创建一个新数组,其中每个原始项目都附加了新值。

(根据经验,使用.forEach().map().filter().reduce().every().some() 在循环数组时几乎总是优于for

【讨论】:

  • 对不起,也没有用。我开始相信我的对象不是 JSON 对象。
  • for 循环确实没问题,但还有其他问题。也许是我的一个愚蠢的错误,我不知道,我会尽力找出来。
  • console.log( Object.prototype.toString.call(results) ); 返回object Array
  • 数组可能是一个实际的数组,但对象不是普通对象。但在这种情况下,如果没有适当的可重现测试用例,就无法回答。
  • 但是,如果我这样做results.newName = "NewValue"; 它可以工作,但它会在之前的数组之外添加一个元素。
【解决方案2】:

我找到答案了!!

我们需要通过在查询链中使用lean() 来告诉Mongoose,我们需要的只是返回的results 的纯JavaScript 版本。

这样 Mongoose 跳过了创建完整模型实例的步骤,我们直接得到了一个 results 我们可以修改

像这样:

exports.Posts = function(UserID, PostID, callback) {

                Post.find( { post: PostID } , function(err, results) {


                        for (var i=0; i<results.length; i++){
                            results[i].newName = "NewValue";
                        }

                        console.log(results);

                        return callback(null, results);

                }).lean();
}

【讨论】:

  • 你能相信吗....这正是我想要的。 JS/Mongo 可以表现得如此奇怪......
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多