我在MongoDB中有一个集合。
{
"_id" : ObjectId("5aaf51369d8bdfe288d1cb71"),
"companyName" : "ABC",
"name" : "BCD",
"buildInfo" : [
{
"Branch" : "IT",
"Subjects" : [
"Math",
"English",
"Computer",
]
}
],
"currentDate" : ISODate("2018-03-14T14:09:24.374Z"),
"lastModifiedBy" : "ABC.com"
}
我想在" buildInfo"中插入一个新对象。如果那个分支不会在那里。如果分支存在,我想更新"主题"。
我正在将Branch和Subjects传递给这个方法。
myDb.collection('ABCDEF').findAndModify(
{'name':'BCD', 'companyName': 'ABC'},
[['_id','asc']],
{
$addToSet: {
'buildInfo.$[i].Subjects': Subjects
}
},
{ upsert: true, arrayFilters: [{ 'i.Branch': Branch }] }
但如果分支在那里它会更新,但如果没有分支,它就不会创建新对象。
答案 0 :(得分:0)
Upsert仅适用于文档级别,不适用于嵌入式文档。
最简单的方法是发布3个连续更新:
myDb.collection('ABCDEF').findAndModify(
{'name':'BCD', 'companyName': 'ABC', '$or': [{'buildInfo':{'$exists': false}}, {'buildInfo': {'$not':{ '$type': 'array' }}}]},
[['_id','asc']],
{
$set: { 'buildInfo': [] }
},
{ upsert: true}
)
接着是
myDb.collection('ABCDEF').findAndModify(
{'name':'BCD', 'companyName': 'ABC', 'buildInfo.Branch': {$nin: [Branch]}},
[['_id','asc']],
{
$push: {
{ buildInfo: { Branch: Branch, Subjects: [] } }
}
}
)
接着是
myDb.collection('ABCDEF').findAndModify(
{'name':'BCD', 'companyName': 'ABC', 'buildInfo.Branch': Branch},
[['_id','asc']],
{
$addToSet: {
'buildInfo.$[].Subjects': Subject
}
}
)
第一个将空buildInfo
数组添加到没有一个的文档中。第二个更新将具有特定Branch
和空Subjects
的子文档添加到没有分支的文档。最后一个查询将Subject
添加到集合中。