我试图在mongo上运行更新查询,这将在现有的数组属性中添加几个值 .
我的目标是在数组的开头添加元素,而不是在默认情况下结束时添加元素 . 这是我正在使用的代码:
db.collection("Project").update({'_id': group.project}, {$addToSet: {'endpointOrder': {$each: group.endpointOrder, $position: 0}}}, {multi: true})
正如您在上面所看到的,如果我只是将'addToSet'更改为使用'push'修饰符,那么工作正常,但这将保留重复项,这是不可能的 . 所以,我的假设是,$ position仅支持'$ push',而不支持'$ addToSet' .
关于如何实现这一点的任何想法/建议?谢谢 .
1 回答
$addToSet运算符生成"set"的"unique"项,这可能就是您所追求的 . 不幸的是,通过MongoDB有一个共同的口头禅和其他"set operators":
因此,当您将项目添加到“集合”(或与其他操作组合)时,无法保证项目出现在任何位置,无论它是“集合”的开头还是结尾 . 官方的说法是任何元素都可以按任何顺序出现,只要它是“集合”的一部分就没关系 .
但还有另外一种方法,它只是意味着你不使用
$addToSet
而是使用其他一些过滤逻辑与$push:结合使用考虑一下文件:
因此,如果我想在列表中添加一个新元素
4
并将其添加到"first"位置,其中该元素不是"set"的一部分,那么您只需构造查询并更新如下:简而言之:“如果数组中已存在值,请不要推送到数组 . ”
真的就是这一切 . 如果您要求添加已存在的元素,那么查询条件当然是
false
并且不会修改任何内容 .最后,您获得与使用
$addToSet
操作相同的结果,除非您可以完全控制元素定位,甚至可以根据需要控制"sorting" . 您需要做的就是在决定是否更改任何内容之前检查匹配元素 .处理多个元素的过程应该真正使用“批量”操作API以获得最高效率
这将导致循环中只有一个更新操作实际匹配或修改任何内容:
或者根本不存在的值:
然后第一个操作实际上会修改,循环指令将不匹配任何东西,因为项目已经存在 .