【发布时间】:2020-06-17 03:33:16
【问题描述】:
这是我的架构:
new Schema({
code: { type: String },
toy_array: [
{
date:{
type:Date(),
default: new Date()
}
toy:{ type:String }
]
}
这是我的数据库:
{
"code": "Toystore A",
"toy_array": [
{
_id:"xxxxx", // automatic
"toy": "buzz"
},
{
_id:"xxxxx", // automatic
"toy": "pope"
}
]
},
{
"code": "Toystore B",
"toy_array": [
{
_id:"xxxxx", // automatic
"toy": "jessie"
}
]
}
我正在尝试更新一个对象。在这种情况下,我想用code: 'ToystoreA' 更新文档,如果数组中不存在玩具,则将一个子文档数组添加到名为toy_array 的数组中。
例如,如果我尝试这样做:
db.mydb.findOneAndUpdate({
code: 'ToystoreA,
/*toy_array: {
$not: {
$elemMatch: {
toy: [{"toy":'woddy'},{"toy":"buzz"}],
},
},
},*/
},
{
$addToSet: {
toy_array: {
$each: [{"toy":'woddy'},{"toy":"buzz"}],
},
},
},
{
new: false,
}
})
它们被添加并且是我想要避免的。
我该怎么做?
[
{
"code": "Toystore A",
"toy_array": [
{
"toy": "buzz"
},
{
"toy": "pope"
}
]
},
{
"code": "Toystore B",
"toy_array": [
{
"toy": "jessie"
}
]
}
]
在此示例中,[{"toy":'woddy'},{"toy":"buzz"}] 应仅添加 'woddy',因为 'buzz' 已在数组中。
注意:当我插入一个新的toy 时,除了一个_id 之外,还会插入一个插入日期(这对我来说很正常)。
【问题讨论】:
-
在这个例子中 [{"toy":'woddy'},{"toy":"buzz"}] 它应该只添加 'pope' 因为 'buzz' 已经在数组。 --> 你确定这个说法吗?你的意思是
woddy而不是pope?如果是,您的代码应该按预期工作.. -
@whoami 你是对的!对不起。
-
@whoami 它添加了这么多的对象元素,而无需进行验证。我会更新代码。每次插入时,都会为每个玩具自动生成一个唯一的 _id,因此我认为每个新元素似乎都是独一无二的。
-
这能回答你的问题吗? Stop Mongoose from creating _id property for sub-document array items 是
$addFields失败了,因为每个对象都有唯一的_id我猜你可能正在使用猫鼬,如果是的话,那么你可以改变你的架构,就像那个链接中提到的那样!! -
@whoami 实际上我确实希望生成它,而且在我的真实代码中也会自动生成一个日期。所以我一直在寻找一种方法来插入一个不存在的对象。在这种情况下,如果
toy是唯一的,则输入一个玩具。
标签: mongodb mongoose mongodb-query aggregation-framework