java修饰符$_使用$ addToSet修饰符在前面添加值

$addToSet运算符生成"set"的"unique"项,这可能就是您所追求的 . 不幸的是,通过MongoDB有一个共同的口头禅和其他"set operators":

“套装不被视为订购”

因此,当您将项目添加到“集合”(或与其他操作组合)时,无法保证项目出现在任何位置,无论它是“集合”的开头还是结尾 . 官方的说法是任何元素都可以按任何顺序出现,只要它是“集合”的一部分就没关系 .

但还有另外一种方法,它只是意味着你不使用 $addToSet 而是使用其他一些过滤逻辑与$push:结合使用

考虑一下文件:

{ "a": [ 3,1,2 ] }

因此,如果我想在列表中添加一个新元素 4 并将其添加到"first"位置,其中该元素不是"set"的一部分,那么您只需构造查询并更新如下:

db.collection.update(

{ "a": { "$ne": 4 } },

{ "$push": { "a": { "$each": [4], "$position": 0 } } }

)

简而言之:“如果数组中已存在值,请不要推送到数组 . ”

真的就是这一切 . 如果您要求添加已存在的元素,那么查询条件当然是 false 并且不会修改任何内容 .

最后,您获得与使用 $addToSet 操作相同的结果,除非您可以完全控制元素定位,甚至可以根据需要控制"sorting" . 您需要做的就是在决定是否更改任何内容之前检查匹配元素 .

处理多个元素的过程应该真正使用“批量”操作API以获得最高效率

var items = [4,3];

var bulk = db.collection.initializeOrderedBulkOp();

bulk.find({ "a": { "$nin": items } }).updateOne(

{ "$push": { "a": { "$each": items, "$position": 0 } } }

);

items.forEach(function(item) {

bulk.find({ "a": { "$ne": item } }).updateOne(

{ "$push": { "a": { "$each": [item], "$position": 0 } } }

);

});

bulk.execute();

这将导致循环中只有一个更新操作实际匹配或修改任何内容:

{ "a": [ 4,3,1,2 ] }

或者根本不存在的值:

var items = [5,8];

var bulk = db.collection.initializeOrderedBulkOp();

bulk.find({ "a": { "$nin": items } }).updateOne(

{ "$push": { "a": { "$each": items, "$position": 0 } } }

);

items.forEach(function(item) {

bulk.find({ "a": { "$ne": item } }).updateOne(

{ "$push": { "a": { "$each": [item], "$position": 0 } } }

);

});

bulk.execute();

然后第一个操作实际上会修改,循环指令将不匹配任何东西,因为项目已经存在 .

{ "a": [ 5,8,4,3,1,2 ] }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值