вставить для $ out не удалось - PullRequest
1 голос
/ 26 мая 2019

Мои документы хранятся в массиве результатов для каждого пользователя.

Типы данных:

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" }])

но получил следующее:

assert: команда завершилась неудачно: { «хорошо»: 0, "errmsg": "вставка для $ out завершилась неудачно: {connectionId: 1, err: \" Индекс ошибки лицензионного ключа E11000 dup: 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 @ (Оболочки): 1: 1

2019-05-26T19: 04: 05.395 + 0200 E QUERY [thread1] Ошибка: команда не удалось: { «хорошо»: 0, «errmsg»: «вставка для $ out завершилась неудачно: {connectionId: 1, err: \» Индекс ошибки ключа дублирования E11000 dup: 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 @ (Оболочки): 1: 1

Как мне этого избежать? Я понимаю проблему, что у меня есть несколько документов с одним и тем же идентификатором, но это именно то, что я хочу.

Есть обходной путь?

1 Ответ

0 голосов
/ 26 мая 2019

Используя $out вы создаете новую коллекцию с именем newcollection. MongoDB требует, чтобы каждый _id был уникальным. Это ограничение не может быть удалено, так как вы $unwind - в массиве могут быть дублированные _id значения в окончательном наборе результатов.

В качестве обходного пути вы можете ввести $project stage и переместить current _id в другое поле, чтобы на него не было уникальных ограничений. MongoDB сгенерирует новые значения _id для всех документов, попробуйте:

db.userschemes.aggregate([
    { "$unwind": "$result"},     
    { $addFields: { userId : "$_id" } },
    { $project: { _id: 0 } },
    { $out : "newcollection" }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...