【问题标题】:insert for $out failed插入 $out 失败
【发布时间】:2019-10-12 09:59:05
【问题描述】:

我的数据库中的文档为每个用户存储了一组结果。

数据类型:

age: {type: Number}, 
gender: {type: String},
result: [{ game: String,time: Number, level: Number, mistakes: Number,moves: Number }]

为了分析我的数据我想unwind结果, 例如以下文档:

{"_id":"5ce58a662f6fcb3b782013e3","age":10,"gender":"Male","result":[{"_id":"5ce58a662f6fcb3b782013e9","game":"puzzle","time":20,"level":3,"mistakes":5,"moves":50},{"_id":"5ce58a662f6fcb3b782013e8","game":"puzzle","time":20,"level":3,"mistakes":5,"moves":50},{"_id":"5ce58a662f6fcb3b782013e7","game":"puzzle","time":20,"level":3,"mistakes":5,"moves":50},{"_id":"5ce58a662f6fcb3b782013e6","game":"memory","time":20,"level":3,"mistakes":5,"moves":50},{"_id":"5ce58a662f6fcb3b782013e5","game":"memory","time":20,"level":3,"mistakes":5,"moves":50},{"_id":"5ce58a662f6fcb3b782013e4","game":"memory","time":20,"level":3,"mistakes":5,"moves":50}],"__v":0}]

将分为 6 个文档,并存储在具有相同 userId 的新集合中。

我尝试过运行:

 db.userschemes.aggregate([{ "$unwind": "$result"},{ $out : "newcollection" }])

但得到以下信息:

断言:命令失败:{ “好”:0, "errmsg" : "insert for $out failed: { connectionId: 1, err: \"E11000 dup licate key error index: vpdata.tmp.agg_out.2.$id dup 键:{:ObjectId('5ce58a 662f6fcb3b782013e3')}\“,代码:11000,n:0, 好的:1.0 }", “代码”:16996 }:聚合失败 _getErrorWithCode@src/mongo/shell/utils.js:25:13 doassert@src/mongo/shell/assert.js:16:14 assert.commandWorked@src/mongo/shell/assert.js:290:5 DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5 @(shell):1:1

2019-05-26T19:04:05.395+0200 E QUERY [thread1] 错误:命令 失败的: { “好”:0, "errmsg" : "insert for $out failed: { connectionId: 1, err: \"E11000 dup licate key error index: vpdata.tmp.agg_out.2.$id dup 键:{:ObjectId('5ce58a 662f6fcb3b782013e3')}\“,代码:11000,n:0, 好的:1.0 }", “代码”:16996 }:聚合失败: _getErrorWithCode@src/mongo/shell/utils.js:25:13 doassert@src/mongo/shell/assert.js:16:14 assert.commandWorked@src/mongo/shell/assert.js:290:5 DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1312:5 @(shell):1:1

我怎样才能避免这种情况?我了解我有多个具有相同 ID 的文档的问题,但这正是我想要的。

有什么解决方法吗?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    使用$out,您正在创建名为newcollection 的新集合。 MongoDB 要求每个 _id 都是唯一的。无法删除该约束,因此当您使用 $unwind-ing 数组时,最终结果集中可能会出现重复的 _id 值。

    作为一种解决方法,您可以引入$project 阶段并将当前_id 移动到不同的字段中,这样就不会有唯一的约束。 MongoDB 将为所有文档生成新的_id 值,尝试:

    db.userschemes.aggregate([
        { "$unwind": "$result"},     
        { $addFields: { userId : "$_id" } },
        { $project: { _id: 0 } },
        { $out : "newcollection" }
    ])
    

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多