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

问题描述 投票:0回答:2

我有以下代码从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

mongodb go bson
2个回答
0
投票

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

func exists(in []bson.M,id interface{}) bool {
   for _,p:=range in {
     if id==in["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
   }
}

0
投票

根据产品ID为旧产品和新产品创建地图

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

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

然后查找消失的产品

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

对于新出现的产品(您可以在为新产品创建地图时执行此部分)

var appProducts []bson.M
for _,newp := range newProducts {
   if _, ok := oldProductsMap[newp["productId"]]; !ok {
       appProducts = append(appProducts, oldp)
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.