node.js - 如果不存在,Mongoose 将项目推送到数组
问题描述
我有一个这样的模型架构:
Collection: {
irrelevant fields,
object: {
more irrelevant fields,
array:
[
{
field1,
field2,
_id: false
}
]
}
}
我想将不与数组中已经存在的 field1 重复的任何对象 {field1, field2} 推送到数组(在 updateOne 查询中)。field2 不断更新自己,我尝试过 addtoset 但它认为 field2 所以它最终添加了另一个我不想添加的项目。
例如:
array:[
{field1: 1, field2: 6},
{field1: 2, field2: 4},
{field1: 3, field2: 1}
]
如果我想推{field1: 2, field2: 6}
它不应该让我推它,因为 field1:2 已经存在于数组中。(使用 addtoset,即使它确实检查了 field1:2 是否已经存在,但由于 field2 不同,它最终会添加 te 对象)
array:[
{field1: 1, field2: 6},
{field1: 2, field2: 4},
{field1: 3, field2: 1}
{field1: 2, field2: 6}
]
解决方案
您可以使用带有$cond运算符的管道形式的更新。如果该field1
值已经存在,则保持数组的值相同,如果不存在,则将新值附加到末尾。
也许类似于:
const newValue = {field1: 2, field2: 6};
db.collection.update({match criteria},
[{$set:{
array:{
$cond:{
if: {$in: [newValue.field1, "$array.field1"]},
then: "$array",
else: {$concatArrays: ["$array", [newValue]]}]}
}
}
}}]
)
推荐阅读
- python - 任何人都可以制作给定内容的 protobuf3 模式吗
- c# - 为什么 Aspose.PDF 程序集会多次加载到 appDomain 中?
- django - 通过 ModelForm 创建的对象未显示在列表中
- selenium-webdriver - 我正在尝试单击搜索按钮,但未单击,并且在控制台中没有任何异常
- javascript - 从 React 中第一个选择的选项中获取第二个选择的值
- ruby-on-rails - 如何在rails中显示has_one关联的值?
- ios - 如何使用 TextField SwiftUI 的 TouchesBegan 和 TouchesEnd 在外部单击时退出键盘
- c++ - 查找每个数组元素的频率
- ssh - 我可以将 SSH 会话从编程语言传递到系统终端吗?
- xcode - 我们能否在新的 macOS Catalina 10.15 beta 中同时使用 Xcode 10.2.1 和 Xcode 11 beta