Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MongoDB中通过单个文档中的数百个数组_Mongodb_Meteor - Fatal编程技术网

如何在MongoDB中通过单个文档中的数百个数组

如何在MongoDB中通过单个文档中的数百个数组,mongodb,meteor,Mongodb,Meteor,我回答这个问题,因为我在帖子中添加了更清晰的标题和更多信息。目前,我的MongoDB在一个文档中包含数百个单独的数组(只有一个_id元素),这些数组中是我所有数据所在的位置(截图如下图所示) 每个数组中都有一个名为“winnings”的数据集,显示每个玩家的总赢款 MongoDB的模式如下: [{ Date: "01/01/2012", Entry ($): "2", Id: "123456", Link: "www.mywebsite.com", Opponent: "Opponent"

我回答这个问题,因为我在帖子中添加了更清晰的标题和更多信息。目前,我的MongoDB在一个文档中包含数百个单独的数组(只有一个_id元素),这些数组中是我所有数据所在的位置(截图如下图所示)

每个数组中都有一个名为“winnings”的数据集,显示每个玩家的总赢款

MongoDB的模式如下:

[{
Date: "01/01/2012",
Entry ($): "2",
Id: "123456",
Link: "www.mywebsite.com",
Opponent: "Opponent"
}]
似乎所有这些阵列都只附加了一个MongoDB唯一id:

因此,我相信,存储在所有这些数组中的所有数据都只位于一个文档中,该文档只与一个MongoDB_id关联

我如何将所有这些集合相加以获得奖金的总和

我通过$group方法通过$sum操作符尝试了MongoDB的聚合方法,但它不起作用。这是我能想到的最接近的事情:

Collection.find().forEach(function(){

return db.Collection.aggregate([
{ $group: {Date:"$Date", total:{$sum:"$Winnings ($)"}}},
])

})

但很明显,它不起作用。我还没有找到一种方法可以只遍历一个文档和数百个数组。尝试在forEach函数中加入parseInt看起来也像是一场噩梦,如果没有$with语句,MongoDB肯定不会接受。甚至不确定forEach是否适合这样做。每一个数组都像这样单独地困扰着我。

< P>你应该考虑把项目作为单独的文档放置。MongoDB在文档上的迭代速度比单个文档中的对象数组快得多。此外,它更简单,是一种很好的做法,并且在设置发布和订阅时是必须的

拥有一个
集合
,其中一个文档包含一个数组,其中包含许多项,这就像使用(json)文件作为存储一样。您(通过使用
集合
)获得的主要好处是Meteor使服务器和客户端之间的数据同步变得容易

    var db = Collection.findOne();
    var winningsSum = 0;
    for(x in db) {
        if(db.hasOwnProperty(x)) {
            if(x!='_id') {  // it's necessary to skip _id, otherwise it returns NaN 
                winningsSum += db[x].winnings;
            }
        }
    }
    console.log(winningsSum); //sum of winnings
因此,对于处理(json数组)数据,您并不局限于mongo api。您可以使用任何喜欢的javascript实现
map reduce
风格的处理,不过我建议使用meteor core附带的库

但是,正如其他人在某个时候提到的,可能最好将文档拆分(例如,使用mongo查询api,将过滤后的数据集发送给客户端,更容易更新)。在这种情况下,逐行处理csv文件,每一行都插入到数据库中,并且都有一个公共
documentId
字段

Papa.parse(未经测试):

这应该将数据拆分为csv文件每行一个db文档

var docId = new Mongo.ObjectID()._str;
Papa.parse(file, {
  complete: function(results) {
    results.data.forEach(row){
      row.docId = docId;
      MyCollection.insert(row);
    }  
  }
});

不能为文档中的子文档或数组应用查询条件。使用“展开”操作符展平文档,然后将其聚合。如果您需要有关查询的帮助,请在问题中包含示例输入和输出数据…好的,谢谢。我试试看。聚合不被识别为函数。我正在运行Mongo的2.6版。将所有内容保存在一个文档中本质上就像将其保存在一个平面文件中(好的,在meteor中,您可以在服务器->客户端之间同步它)。因此,对于迭代,您不局限于mongo api。可以使用map reduce样式处理,例如使用下划线库。不过@KG32是对的,请考虑更改您的模式,让数据库在这里帮助您!嘿@JeremyK,谢谢你的意见。我完全忘记了。你帮我解决了我的问题。如果你愿意,你可以把它贴在下面的评论栏,这样我就可以投票给你了。我认为这是不可能的。我让用户上传一个.csv文件,然后将其解析为JSON格式。不幸的是,结果最终是在一个文档下的数组中。这是可能的。循环csv和
集合中的每一行。插入(ConvertToJSON(rowData+CommonDocumentId))
。为每行添加一个公共文档id,以便您可以检索属于一个文件的文档集。我重新创建了您的数据库,它可以正常工作。希望我没有做错什么,让我知道它是否对你有效。结果它给了我0。另外,如果您不介意的话,您的解决方案中的
hasOwnProperty
的目的是什么。文件中的所有条目都是字符串。谢谢。好吧,我想我在复制你的数据库时出错了,我会再检查一遍。关于hasOwnProperty,它让您知道属性是直接位于对象实例上还是从其原型链继承的。这样更安全,尤其是因为我正试图为一个我并不完全了解的数据库找到一个解决方案。好的,谢谢你。你也帮了我不少忙。我认为问题在于我数据库中的数字实际上不是数字,而是字符串。所以使用数字(字符串)可能是一个解决方案。哦,对了,没注意到,愚蠢但关键的细节。这就是为什么它在我的数据库中起作用。我昨天没试过,但从其他评论来看,我想你已经修好了。不管怎样,如果它仍然不起作用,我很乐意尝试帮助他。我使用Papa Parse来解析文档。我必须检查一下,看看如何以一种可以实际使用MongoDB api的方式处理它。