如何使用Golang比较两个bson.M数据集

时间:2020-05-15 18:15:07

标签: mongodb go bson

我有以下代码,可从MongoDB数据库中的两个不同集合中检索两个数据集

    opts := options.Find()
    opts.SetProjection(bson.M{
        "productId": 1,
        "_id": 0,
    })

    cursor, err := currentProductsCollection.Find(ctx, bson.M{}, opts)
    var oldProducts []bson.M
    err = cursor.All(ctx, &oldProducts)

    cursor, err = newProductsCollection.Find(ctx, bson.M{}, opts)
    var newProducts []bson.M
    err = cursor.All(ctx, &newProducts)

我希望能够将oldProductsnewProducts进行比较,以找出出现了哪些新的productId,以及消失了哪些旧的productId。

这两个变量都很好地加载了,我可以在调试器中愉快地检查它们,但是我似乎找不到一种比较它们的方法。我希望能够依次遍历每个对象,并在另一个对象上查找并得到几片缺失值,但是我找不到任何方法。

过去三个小时,我一直在这附近走动,所以如果有人有任何建议,我将非常欢迎他们。

我使用的是香草go.mongodb.org/mongo-driver驱动程序,而不是mgo

2 个答案:

答案 0 :(得分:2)

通过产品ID为旧产品和新产品创建地图

oldProductsMap = make(map[interface{}]bson.M)
for _,oldp := range oldProducts {
   oldProductsMap[oldp["productId"]] = oldp
}

newProductsMap = make(map[interface{}]bson.M)
for _,newp :=range newProducts {
   newProductsMap[newp["productId"]] = newp
}

然后对于消失的产品,检查旧产品在newProductsMap中。如果没有,则产品消失

var disProducts []bson.M
for _,oldp := range oldProducts {
   if _, ok := newProductsMap[oldp["productId"]]; !ok {
       disProducts = append(disProducts, oldp) 
   }
}

对于新出现的产品,请检查新产品在oldProductsMap中。如果没有,那么该产品将重新出现。

var appProducts []bson.M
for _,newp := range newProducts {
   if _, ok := oldProductsMap[newp["productId"]]; !ok {
       appProducts = append(appProducts, oldp)
   }
}

注意您还可以在为新产品创建地图时执行此部分

答案 1 :(得分:1)

如果您确定所有条目都具有productId字段:

func exists(in []bson.M,id interface{}) bool {
   for _,p:=range in {
     if id==p["productId"] {
        return true
     }
   }
  return false
}

然后使用它来扫描两个列表:

for _,oldp:=range oldProducts {
   if !exists(newProducts,oldp["productId"]) {
     // Removed
   }
}

for _,newp:=range newProducts {
   if !exists(oldProducts,newp["productId"]) {
     // Added
   }
}