Mongodb 在集合中查找具有匹配字段的文档,并从匹配的文档中添加新字段

Mongodb 在集合中查找具有匹配字段的文档,并从匹配的文档中添加新字段,mongodb,Mongodb,我收藏了汽车,注册,汽车规格 我需要创建两个新集合 cars\u registrations-这将RegNo从registrations添加到cars,用于具有相同StreetNo和HouseNo的文档,丢弃不匹配的文档 cars\u registrations\u spec-这将CarSpec从car\u specs添加到cars\u registrations收集具有相同StreetNo和HouseNo的文档 从控制台执行此操作的最有效方式是什么?我在cars集合中有500K个文档,在reg

我收藏了
汽车
注册
汽车规格

我需要创建两个新集合

  • cars\u registrations
    -这将
    RegNo
    registrations
    添加到
    cars
    ,用于具有相同
    StreetNo
    HouseNo
    的文档,丢弃不匹配的文档

  • cars\u registrations\u spec
    -这将
    CarSpec
    car\u specs
    添加到
    cars\u registrations
    收集具有相同
    StreetNo
    HouseNo
    的文档

  • 从控制台执行此操作的最有效方式是什么?我在
    cars
    集合中有500K个文档,在
    registrations
    集合中有50K个文档

    汽车:

    [
            { "StreetNo": 321, "HouseNo": "12",  "Car": "camry" },
            { "StreetNo": 321, "HouseNo": "13",  "Car": "camry" },
            { "StreetNo": 323, "HouseNo": "12",  "Car": "accord" },
            { "StreetNo": 324, "HouseNo": "15",  "Car": "Sunny" }
        ]
    
    [
            { "StreetNo": 321, "HouseNo": "12",  "RegNo": "1122" },
            { "StreetNo": 321, "HouseNo": "13",  "RegNo": "1123" },
            { "StreetNo": 323, "HouseNo": "12",  "RegNo": "1124" },
        ]
    
    注册:

    [
            { "StreetNo": 321, "HouseNo": "12",  "Car": "camry" },
            { "StreetNo": 321, "HouseNo": "13",  "Car": "camry" },
            { "StreetNo": 323, "HouseNo": "12",  "Car": "accord" },
            { "StreetNo": 324, "HouseNo": "15",  "Car": "Sunny" }
        ]
    
    [
            { "StreetNo": 321, "HouseNo": "12",  "RegNo": "1122" },
            { "StreetNo": 321, "HouseNo": "13",  "RegNo": "1123" },
            { "StreetNo": 323, "HouseNo": "12",  "RegNo": "1124" },
        ]
    
    汽车注册

    [
            { "StreetNo": 321, "HouseNo": "12",  "Car": "camry",  "RegNo": "1122"  },
            { "StreetNo": 321, "HouseNo": "13",  "Car": "camry",  "RegNo": "1123" },
            { "StreetNo": 323, "HouseNo": "12",  "Car": "accord",  "RegNo": "1124" }
        ]
    
    [
            { "StreetNo": 321, "HouseNo": "12",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 321, "HouseNo": "13",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 323, "HouseNo": "12",  "CarSpec": {"cyl": "6", "gear": "7"} }
        ]
    
    var results = db.registrations.find({}, {_id: 0}).toArray();
    for( var i = 0; i < results.length; i++) {
        var car = db.car.findOne({$and: [{StreetNo: results[i]["StreetNo"]},
        {HouseNo: results[i]["HouseNo"]}] }, {_id: 0});
        if(car && results[i]["RegNo"]) {
            car["RegNo"] = results[i]["RegNo"]
            db.cars_registrations.insertOne(car);
        }
    }
    
    汽车规格

    [
            { "StreetNo": 321, "HouseNo": "12",  "Car": "camry",  "RegNo": "1122"  },
            { "StreetNo": 321, "HouseNo": "13",  "Car": "camry",  "RegNo": "1123" },
            { "StreetNo": 323, "HouseNo": "12",  "Car": "accord",  "RegNo": "1124" }
        ]
    
    [
            { "StreetNo": 321, "HouseNo": "12",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 321, "HouseNo": "13",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 323, "HouseNo": "12",  "CarSpec": {"cyl": "6", "gear": "7"} }
        ]
    
    var results = db.registrations.find({}, {_id: 0}).toArray();
    for( var i = 0; i < results.length; i++) {
        var car = db.car.findOne({$and: [{StreetNo: results[i]["StreetNo"]},
        {HouseNo: results[i]["HouseNo"]}] }, {_id: 0});
        if(car && results[i]["RegNo"]) {
            car["RegNo"] = results[i]["RegNo"]
            db.cars_registrations.insertOne(car);
        }
    }
    
    车辆注册\u规格

    [
            { "StreetNo": 321, "HouseNo": "12",  "Car": "camry",  "RegNo": "1122",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 321, "HouseNo": "13",  "Car": "camry",  "RegNo": "1123",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 323, "HouseNo": "12",  "Car": "accord", "RegNo": "1124", "CarSpec": {"cyl": "6", "gear": "7"} }
        ]
    
    下面是一种尝试的方法。但是,这需要花费很长时间才能完成集合中文档的数量-这样做的正确
    mongodb方法是什么

    用于汽车注册

    [
            { "StreetNo": 321, "HouseNo": "12",  "Car": "camry",  "RegNo": "1122"  },
            { "StreetNo": 321, "HouseNo": "13",  "Car": "camry",  "RegNo": "1123" },
            { "StreetNo": 323, "HouseNo": "12",  "Car": "accord",  "RegNo": "1124" }
        ]
    
    [
            { "StreetNo": 321, "HouseNo": "12",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 321, "HouseNo": "13",  "CarSpec": {"cyl": "4", "gear": "5"} },
            { "StreetNo": 323, "HouseNo": "12",  "CarSpec": {"cyl": "6", "gear": "7"} }
        ]
    
    var results = db.registrations.find({}, {_id: 0}).toArray();
    for( var i = 0; i < results.length; i++) {
        var car = db.car.findOne({$and: [{StreetNo: results[i]["StreetNo"]},
        {HouseNo: results[i]["HouseNo"]}] }, {_id: 0});
        if(car && results[i]["RegNo"]) {
            car["RegNo"] = results[i]["RegNo"]
            db.cars_registrations.insertOne(car);
        }
    }
    
    var results=db.registrations.find({},{u id:0}).toArray();
    对于(var i=0;i

    我的问题是,这需要很长的时间-很多很多小时-我的猜测是,
    findOne
    $和
    需要很多时间-对于我来说,在一个拥有500K文档的汽车收藏和拥有50K文档的注册收藏上完成这项工作需要很多小时。这通常会花费这么多时间吗?

    您需要使用聚合框架。您需要使用聚合框架。