Mongodb обновить значение дублированного массива - PullRequest
0 голосов
/ 29 января 2020

Я получаю массив данных и хочу вставить их в мой mongodb. Я хочу перезаписать любые дублирующиеся значения новым (при загрузке Im), и если нет дубликатов, просто добавьте их в текущий массив.

У меня есть:

db.cases.updateOne(
    { companyID: 218 },
    {
      $addToSet: {
        cases: [AN ARRAY OF CASES]
      },
      $currentDate: { lastModified: true }
    })

Коллекция имеет несколько компаний, и у каждой есть множество случаев - см. изображение ниже:

enter image description here

Другая вещь, которая, кажется, не работает, - то, что currentDate , кажется, не меняется, когда я обновляю дела, не уверен, так ли я написал запрос?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Итак, я решил взломать, но это не совсем то, что я хотел - может быть, кто-то может использовать это и расширить его, чтобы заставить его работать лучше:

db.cases.aggregate(
    { $match: { 'companyID': 218 }},
    { $unwind: '$cases' }, 
    { $group: { "_id": "$cases.casenumber", cases: {$push:'$cases'}, "count": { $sum:1 }}},
    { $match: { "count": { "$gt": 1 }}}
    { $project: { "cases": { $slice: [ "$cases", -1, { $subtract: [ { $size: "$cases" }, 1 ]}] }}},
    { $project: { "cases": { $arrayElemAt: ['$cases', 0] }}},
    { $group: { _id: 1, cases: {$push:'$cases' }}},
    { $out: 'cases' }
)

Единственная проблема заключается в том, что использование перезаписывает документ кейсов, поэтому мне нужно найти способ записать его в массив кейсов внутри идентификатора компании (218)

Надеюсь, это кому-нибудь поможет.

Спасибо.

0 голосов
/ 29 января 2020

Вы можете использовать $ addToSet (https://docs.mongodb.com/manual/reference/operator/update/addToSet/) с $ [] (https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/) для выполнения sh этого.

Я написал сценарий пример в Node.js, чтобы показать вам, что я имею в виду:

const { MongoClient } = require('mongodb');

async function main() {
    /**
     * Connection URI. Update <username>, <password>, and <your-cluster-url> to reflect your cluster.
     */
    const uri = "mongodb+srv://<username>:<password>@<your-cluster-url>?retryWrites=true&w=majority";

    /**
     * The Mongo Client you will use to interact with your database
     */
    const client = new MongoClient(uri, { useUnifiedTopology: true });

    try {
        // Connect to the MongoDB cluster
        await client.connect();

        // Make the appropriate DB calls
        await updateArray(client, 'id1')


    } finally {
        // Close the connection to the MongoDB cluster
        await client.close();
    }
}

main().catch(console.error);

async function updateArray(client, id) {
    const docId = "299";
    const mynewdoc = {
        id: docId,
        priority: 5,
        casenumber: 40,
        new: "field"
    }
    const result = await client.db("NameOfYourDb").collection("NameOfYourCollection").updateOne(
        { _id: id },
        {
            $set: {
                "cases.$[element]": mynewdoc
            }
        },
        {
            arrayFilters: [{ "element.id": docId }]
        }
    )

    if (result) {
        console.log(result);
    } else {
        console.log(`Not found '${id}'`);
    }

    const result2 = await client.db("NameOfYourDb").collection("NameOfYourCollection").updateOne(
        { _id: id },
        {
            $addToSet: {
                "cases": mynewdoc
            }
        }
    )

    if (result2) {
        console.log(result2);
    } else {
        console.log(`Not found '${id}'`);
    }

}

См. https://www.mongodb.com/blog/post/quick-start-nodejs-mongodb--how-to-get-connected-to-your-database для объяснения того, как структурирован код Node.js.

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