mongodb,在追加到数组时检查键是否存在
mongodb, check if the key exist while appending to an array
注意:检查键 books
是否存在,如果不存在则创建,然后更新它。
我正在使用 mongodb 驱动程序和 nodejs。
在db.collection('userData')
文档中是这样的:
{
user_id: 'user1',
books: [{
id: 'book1',
title: 'this is book1'
},
{
id: 'book1',
title: 'this is book1'
}]
}
插入新书目时,如何判断文档中是否存在books
的数组,如果不存在则在文档中添加关键字books
,然后插入书目。
您必须执行 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);
第二个选项你可以使用 update with aggregation pipeline 从 MongoDB 4.2 开始,
$ifNull
检查字段是否为空然后 return []
$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 }
);
注意:检查键 books
是否存在,如果不存在则创建,然后更新它。
我正在使用 mongodb 驱动程序和 nodejs。
在db.collection('userData')
文档中是这样的:
{
user_id: 'user1',
books: [{
id: 'book1',
title: 'this is book1'
},
{
id: 'book1',
title: 'this is book1'
}]
}
插入新书目时,如何判断文档中是否存在books
的数组,如果不存在则在文档中添加关键字books
,然后插入书目。
您必须执行 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);
第二个选项你可以使用 update with aggregation pipeline 从 MongoDB 4.2 开始,
$ifNull
检查字段是否为空然后 return []$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 }
);