MongoDB выдвигает предоставленный пользователем массив объектов внутри массива объектов mongodb, чтобы не было дубликатов - PullRequest
0 голосов
/ 19 ноября 2018

Предположим, у меня есть коллекция документов

{ "id":1, "arr":[{"a":1, "b":2, "c":3}, {"a":6, "b":0, "c":8},....]}
{ "id":2, "arr":[{"a":7, "b":1, "c":4}, {"a":5, "b":2, "c":6},....]}

Теперь пользователь предоставит мне массив неизвестного размера, как этот

let user_id: 2;
let user_arr = [{"a":7, "b":1, "c":9}, {"a":1, "b":6, "c":3},.....]

Теперь я хочу отправить предоставленные пользователем документы arr в arr для пользователя user_id, предоставленные пользователем, так что (a, b) комбинация обоих значений не будет дублирована для него / нее.

Например, для вышеприведенного случая, поскольку (a:7, b:1) уже существует в arr, поэтому он не будет вставлен, но для (a:1, b:6) ни одна запись не содержит их обоих, поэтому он {"a":1, "b":6, "c":3} вставляется в arr.

Пожалуйста, помогите мне, кто угодно.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете использовать $ elemMatch в сочетании с $not, чтобы проверить, не будет ли документ, который вы пытаетесь $ push , дублировать любой другой поддокумент в этом массиве.Попробуйте:

db.col.update({ id: user_id, arr: { $not: { $elemMatch: { a: 7, b: 1 } } } }, { $push: { arr: { a:7, b:1, c:9} } })

Дополнительное условие для id заставит эту операцию изменить один или ноль документов.

Для выполнения нескольких обновлений вы можете использовать bulkWrite (MongoDB3.2 +):

db.col.bulkWrite(
    [
        { 
            updateOne : {
                    "filter" : { id: 2, arr: { $not: { $elemMatch: { a: 7, b: 1 } } } },
                    "update" : { $push: { arr: { a:7, b:1, c:9} } }
                }
        },
        { 
            updateOne : {
                    "filter" : { id: 2, arr: { $not: { $elemMatch: { a: 1, b: 6 } } } },
                    "update" : { $push: { arr: { a:1, b:6, c:3} } }
                }
        }
    ]
);

В ответ вы получите:

{
    "acknowledged" : true,
    "deletedCount" : 0,
    "insertedCount" : 0,
    "matchedCount" : 1,
    "upsertedCount" : 0,
    "insertedIds" : {

    },
    "upsertedIds" : {

    }
}

, что означает, что только одно из двух условий соответствует документу с id: 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...