美文网首页
2018-07-04 不懂为何mongo聚合结果保存到新集合时会

2018-07-04 不懂为何mongo聚合结果保存到新集合时会

作者: 五大RobertWu伍洋 | 来源:发表于2018-09-23 12:26 被阅读30次

WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: Stats.robert index: id dup key: { : { netunion_id: 11, netunion_name: "SoloAds", offer_id: "15629001", offer_name: "LotteMart KR Android Non incent IMRO60384", offer_uniqueid: "21115629001", channel_id: 146, channel_name: "boommob", country: "KR", platform: "android", package_name: "com.lottemart.shopping", in_price: 0.8100000000000001, in_currency: "USD", out_price: 0.891, out_currency: "USD", date: "2018-07-03" } }"
}
})

上述报错是在保存聚合结果到新的集合时出现的。
不太懂既然_id时分组条件,那么聚合结果中当然应该时唯一的啊,那么为何还报错 _id 重复呢?

最后发现是matchObj位置放错了,导致匹配条件语句错误,没有匹配到结果,所以agg根本没有效果,出现同样的数据。matchObj应该放在所有for循环的外面吧。

实践中修改诸多地方后可以使用了。所以说正确agg的话不会出现主键重复的!

dbname = "Stats";
collname = "robert_copy";
var collection = db.getSiblingDB(dbname).getCollection(collname);
var userdb = "User";
var usercoll = "channel";
var usercollection = db.getSiblingDB(userdb).getCollection(usercoll);
for (var ids = 160; ids > 130; ids--) {
var userc = usercollection.find({
id: 146
});
for (var datac = userc; datac.hasNext(); ) {
var groupObj = {
group: { _id: { "netunion_id": "netunion_id",
"netunion_name": "netunion_name", "offer_id": "offer_id",
"offer_name": "offer_name", "offer_uniqueid": "offer_uniqueid",
"channel_id": "channel_id", "channel_name": "channel_name",
"country": "country", "platform": "platform",
"package_name": "package_name", "in_price": "in_price",
"in_currency": "in_currency", "out_price": "out_price",
"out_currency": "out_currency", "date": "date",
},
"netunion_id": {
first: "netunion_id"
},
"netunion_name": {
first: "netunion_name"
},
"offer_id": {
first: "offer_id"
},
"offer_name": {
first: "offer_name"
},
"offer_uniqueid": {
first: "offer_uniqueid"
},
"channel_id": {
first: "channel_id"
},
"channel_name": {
first: "channel_name"
},
"country": {
first: "country"
},
"platform": {
first: "platform"
},
"package_name": {
first: "package_name"
},
"in_price": {
first: "in_price"
},
"in_currency": {
first: "in_currency"
},
"out_price": {
first: "out_price"
},
"out_currency": {
first: "out_currency"
},
"date": {
first: "date"
},
"click": {
sum: "click"
},
"click_invalid": {
sum: "click_invalid"
},
"total_cvs": {
sum: "total_cvs"
},
"idp_cvs": {
sum: "idp_cvs"
},
"test_cvs": {
sum: "test_cvs"
},
}
};
var matchObj = {
match: { "date": /^2018-07-0.*/,
"clk_unix_ms": {
exists: true } } }; var data = datac.next(); for (let[i, ch]of(data["subchan"] || []).entries()) { //groupObj["group"]["id"]["subchannel" + ch.replace(/./g,"")]="$" + "subchannel_" + ch.replace(/\./g,"");
groupObj["group"]["subchannel_" + ch.replace(/\./g, "`")] = {push: "" + "subchannel_" + ch.replace(/\./g, "`") }; matchObj["match"]["channel_id"] = data["id"];
}
//print(JSON.stringify(matchObj));
//print(JSON.stringify(groupObj));
var c = collection.aggregate([matchObj, groupObj]);
var coll2 = "robert2";
for (var ldata = c; ldata.hasNext(); ) {
var sudata = ldata.next();
delete sudata['_id'];
for (let[i, key]of Object.keys(sudata).entries()) {
if (JSON.stringify(sudata[key]) === '[]') {
// print(i + ", key : " + key + " , data : " + sudata[key] );
delete sudata[key];
}
}
db.getCollection(coll2).insert(sudata);
}
//break
//c.forEach( function(doc) { print(JSON.stringify(doc));});
}
}

相关文章

  • 2018-07-04 不懂为何mongo聚合结果保存到新集合时会

    WriteResult({"nInserted" : 0,"writeError" : {"code" : 110...

  • mongo聚合

    mongo聚合

  • mongo回顾(七:聚合查询)

    上一篇简单介绍了mongo的增删改查,今天来聊聊mongo的聚合操作 什么是 MongoDB 聚合框架 Mongo...

  • Mongo聚合的使用方法

    Mongo使用聚合框架可以对集合中的文档进行变换和组合。原理是用多个构件(筛选filtering、投射projec...

  • mongo聚合

    aggregate聚合 插入参数 现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果...

  • mongo $match查询日期结果错误

    今天使用mongo聚合查询某个时间段的数据 发现返回结果错误 经过排查问题 在聚合中$match查询和平常使用fi...

  • 更新mongo版本

    换了电脑,软件几乎都是安装的最新版本的,结果mongo版本和项目不适用,原因是Mongo的聚合查询要强制使用c...

  • Meteor API Collections

    流星将数据存储在集合中。 首先,使用新的Mongo.Collection声明一个集合。 集合的名称。 如果为nul...

  • mongo聚合框架

       聚合框架可以对集合中的文档进行变换和组合。基本上,可以用多个构件创建一个管道(pipeline),用于对一连...

  • mongo聚合操作

    每个用户的发帖量 对帖子的重新展示(forum_view)

网友评论

      本文标题:2018-07-04 不懂为何mongo聚合结果保存到新集合时会

      本文链接:https://www.haomeiwen.com/subject/ruxyuftx.html