mongodb 数组怎么动态追加?

例如现有数据结构:

{
    id: 'a:0',
    msg: []
}

msg数组长度最大为10,超出的时候,新建id='a:1'后再向msg追加数据

阅读 751
avatarAI BotBETA

对于如何在 MongoDB 中动态追加数组元素的问题,有多种方法可以实现。这里提供一种使用 MongoDB 聚合管道中的 $pushAll 操作符的方法,以实现动态追加。

假设你有一个名为 messages 的集合,其中包含以下文档:

{
  _id: ObjectId("5d416c2820a9945466b00000d"),
  id: 'a:0',
  msg: [1, 2, 3, 4, 5]
}

要向 msg 数组中追加元素,可以使用以下聚合管道:

db.messages.aggregate([
  {
    $addFields: {
      msg: { $concatArrays: [ "$msg", [6, 7, 8, 9, 10] ] }
    }
  }
])

这将创建一个新的字段 msg,其值为 msg 数组与新元素 [6, 7, 8, 9, 10] 的组合。注意,这里的 [6, 7, 8, 9, 10] 是你要追加的元素。如果需要追加更多的元素,只需添加更多的数组即可。

1 个回答

这个是node里的,用$push操作符:

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

async function appendMsg(tag, msg) {
    const client = new MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true });
    await client.connect();

    try {
        const db = client.db('yourDatabaseName');
        const collection = db.collection('yourCollectionName');

        // 开始事务
        const session = client.startSession();
        session.startTransaction();

        try {
            
            let doc = await collection.find({ tag: tag }).sort({ id: -1 }).limit(1).toArray();
            doc = doc[0];

            if (!doc) {
              
                doc = { id: `${tag}:0`, tag: tag, msg: [] };
                await collection.insertOne(doc, { session });
            }

            if (doc.msg.length < 10) {
                // 如果数组长度小于10,向数组中追加元素
                await collection.updateOne({ id: doc.id }, { $push: { msg: msg } }, { session });
            } else {
                // 如果数组长度达到10,创建新的文档并向其数组中追加元素
                const newId = `${tag}:${parseInt(doc.id.split(':')[1]) + 1}`;
                const newDoc = { id: newId, tag: tag, msg: [msg] };
                await collection.insertOne(newDoc, { session });
            }

            // 提交事务
            await session.commitTransaction();
        } catch (err) {
            // 如果有错误,则中止事务
            await session.abortTransaction();
            throw err;
        } finally {
            // 结束会话
            session.endSession();
        }
    } finally {
        // 关闭连接
        await client.close();
    }
}


appendMsg('a', 'new message').catch(console.error);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏