Mongo 使用

mongo个人收集的一些技巧

1 插入不重复的数据到数组里,并只保留指定数量的数据(数组长度不变)

查了一圈,最后在stackoverflow找到的解决办法。。我太菜了没想到这么简单的方法

mongo更新数组数据有$push$addToSet
$push支持多种运算符但是不会对插入的数据自动筛选,数组里会插入重复值;
$addToSet不会插入重复值,但是不支持很多运算符,包括$slice,所以没法指定插入后的数组长度

数据库内容:{"insert":"this","a":[111,666,777,888]}
-----------------------------------------------------------
push:
db.collection.update(
    { "insert":"this" },
    { "$push": { "a": { 
          "$each": [111,222,333],  //插入数组内所有数据
          "$position":0,    //指定插入位置
          "$sort":1    //对插入后的数据排序,1升序 -1降序
          "$slice":5  //插入后的数组只保留5个数据;5是保留数组前面5个,保留后5个可以用-5
          }
    }
)
结果:{"insert":"this","a":[111,111,222,333,666]}    //有重复数据
------------------------------------------------------------
addToSet:
db.collection.update(
    { "insert":"this" },
    { "$addToSet": { "a": { "$each": [111,222,333]} }    //addToSet只能用$each,所以没法保留指定长度的数组
)
结果:{"insert":"this","a":[111,222,333,666,777,888]}    //无重复但是不能限制长度

使用$ne(not equal)运算符可以先判定a是否有111,再进行插入操作,缺点就是$each没法直接接数组,需要自己写个循环遍历要插入的数据

python代码:
    for i in [111,222,333]:
        db.test.update_one(
            {"$and": [{"insert": "this"}, {"a": {"$ne": i}}]},
            {
                "$push": {
                    "a": {"$each": [i], "$position": 0, "$sort": 1, "$slice": 5}
                }
            },
        )
结果:{"insert" : "this", "a" : [ 111, 222, 333, 666, 777 ]}    //111没有插入

参考:https://stackoom.com/question/27EXs/%E4%BD%BF%E7%94%A8-addToSet%E4%BF%AE%E9%A5%B0%E7%AC%A6%E5%9C%A8%E5%89%8D%E9%9D%A2%E6%B7%BB%E5%8A%A0%E5%80%BC
不知道有什么更好的办法

2 获取重复数据

db.table_name.aggregate( {'$group':{

  '_id': {'字段名': '$字段名'},

  'uniqueIds': {'$addToSet': '$_id'},

  'count' : {'$sum': 1}

}},

{'$match': {

  'count': {'$gt': 1}

}})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。