Mongodb AddToSet新对象或更新现有计数器

Mongodb AddToSet新对象或更新现有计数器,mongodb,Mongodb,我有文档{id:1,数据:[{'name':'Bob','counter':1},{'name':'Jack','counter':1}} 我所期待的: 查询: db.inventory.update( { _id: 1 }, { $addToSet: { data: { $each: [{'name': 'Bob'}, {'name':'Jack'}, {'name':'John'}] } } } ) 结果: {id:1,数据:[{'name':'Bob','counter':

我有文档
{id:1,数据:[{'name':'Bob','counter':1},{'name':'Jack','counter':1}}

我所期待的:

查询:

db.inventory.update(
   { _id: 1 },
   { $addToSet: { data: { $each: [{'name': 'Bob'}, {'name':'Jack'}, {'name':'John'}] } } }
 )
结果:


{id:1,数据:[{'name':'Bob','counter':2},{'name':'Jack','counter':2},{'name':'John','counter':1}}

您将无法在单个查询中完成此操作。
$addToSet
运算符仅在添加的元素与存在的元素完全匹配时才起作用。相反,您需要分多个部分进行:

//如果Bob不存在,则插入该元素。
db.inventory.update(
{
_id:1,
“data.name”:{$ne:“Bob”}
},
{
$push:{
数据:{
姓名:“鲍勃”,
计数器:0//初始化为0,以便第一个增量产生预期值1。
}
}
}
)
//增加鲍勃的计数器。
db.inventory.update(
{
_id:1,
“data.name”:“Bob”
},
{
$inc:{
“数据.$计数器”:1
}
}
)
//根据需要对要插入的每个图元重复此操作。
这只是一个限制,您需要使用现有的文档结构来解决。如果修改文档结构,使
数据
是一个嵌套的子文档,每个
名称
都是该子文档中的一个字段,则可以通过单个查询来实现这一点:

//版本1:固定值。
db.inventory.update(
{u id:1},
{$inc:{
“data.Bob”:1,
“数据杰克”:1
}}
)
/*
文档将如下所示:
{
_id:1,
数据:{
鲍勃:2,
杰克:2,
约翰:1
}
}
*/
//版本2:嵌套子文档。
db.inventory.update(
{u id:1},
{$inc:{
“data.Bob.counter”:1,
“数据插孔计数器”:1
}}
)
/*
文档将如下所示:
{
_id:1,
数据:{
鲍勃:{
柜台:2
},
杰克:{
柜台:2
},
约翰:{
柜台:1
}
}
}
*/
但是,请注意,如果使用此解决方案,您将无法有效地索引
数据
,因此无法有效地查询包含
数据元素的所有文档。$.counter>1

权衡是你的考虑。您可以拥有高效的更新或高效的查找,但两者都不太可能实现。我个人建议单独更新每个元素,但您将比我更了解您的程序的需求