【问题标题】:mongodb, check if the key exist while appending to an arraymongodb,在附加到数组时检查键是否存在
【发布时间】:2021-04-23 09:39:57
【问题描述】:

注意:检查密钥books是否存在,如果不存在则创建并更新它。

我正在使用带有 nodejs 的 mongodb 驱动程序。

db.collection('userData')的文件长这样:

{ 
    user_id: 'user1',
    books: [{
               id: 'book1',
               title: 'this is book1'
    },
            {
               id: 'book1',
               title: 'this is book1'
    }]
}

在插入新书目时,如何检查文档中是否存在books的数组,如果不存在则在文档中添加键books,然后插入书目。

【问题讨论】:

标签: node.js mongodb mongodb-nodejs-driver


【解决方案1】:

您必须执行 2 个单独的查询,

  • 查找用户文档
  • 如果存在书籍字段,请检查条件
  • 如果存在则推送对象,否则设置新字段
var user_id = "user1";
var bookData = { id: 'book1', title: 'this is book1' };

// FIND USER DATA
var userData = await db.collection('userData').findOne({ user_id: user_id }, { books: 1 });

var updateBody = { $push: { books: bookData } };
// IF BOOKS FIELD NOT PRESENT THEN SET NEW
if (!userData.books) {
  updateBody = { $set: { books: [bookData] } };
}

var updateData = await db.collection('userData').updateOne({ user_id: user_id }, updateBody);

console.log(updateData);

从 MongoDB 4.2 开始,您可以使用 update with aggregation pipeline 的第二个选项,

  • $ifNull 检查字段是否为空然后返回 []
  • $concatArrays 将当前 books 与新书对象连接
var bookData = { id: 'book1', title: 'this is book1' };
db.collection('userData').update({
    // put your condition
  },
  [{
    $set: {
      books: {
        $concatArrays: [
          { $ifNull: ["$books", []] },
          [bookData]
        ]
      }
    }
  }],
  { multi: true }
);

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多