我在mongodb中使用批量操作。我有一种情况,如果不满足条件,我需要将对象推入数组字段。
如果configs
中没有匹配itype
和prefix
的项目,那么它应该将对象推送到configs
。我怎么能这样做?
//! Find and push if document found but item does not exist.
orderedBulkOP.find({
"cid": newConfig.cid,
"username": newConfig.username,
"configs": {
$elemMatch: {
"itype": newConfig.itype, "prefix": newConfig.prefix
}
}
}).update({
$push: {
"configs": {
"itype": newConfig.itype,
"prefix": newConfig.prefix,
"count": 0,
"createdAt": new Date().toISOString()
}
}
});
架构是这样的:
{
id: String,
uniqid: String,
cid: String,
username: String,
configs: [{
createdAt: Date,
itype: String,
prefix: String,
count: Number
}
]
}
答案 0 :(得分:0)
如果配置中没有匹配itype和前缀的项目, 然后它应该将对象推入配置
您可能在这里寻找upsert
操作。
您可以尝试将查询更新为:
orderedBulkOP.find({
"cid": newConfig.cid,
"username": newConfig.username,
"configs": {
$elemMatch: {
"itype": newConfig.itype, "prefix": newConfig.prefix
}
}
}).upsert().update({
$push: {
"configs": {
"itype": newConfig.itype,
"prefix": newConfig.prefix,
"count": 0,
"createdAt": new Date().toISOString()
}
}
});
如果没有匹配的文档,则将upsert选项设置为true Bulk.find()条件,然后更新或替换 操作执行插入。
如果用例仅在未找到具有组合的文档时插入,否则不执行任何操作。然后,您可以在update
中使用setOnInsert
,有点像:
update({
"$setOnInsert": {
"configs": {
"itype": newConfig.itype,
"prefix": newConfig.prefix
}
}
});
如果使用
upsert: true
的更新操作生成insert
文档,则$setOnInsert
会将指定的值分配给文档中的字段。如果插入中的更新操作未导致,则
$setOnInsert
不执行任何操作。