Объединение документов из нескольких коллекций в документ в единый сбор [дубликат]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

177
задан Max Isom 2 December 2014 в 23:58
поделиться

9 ответов

Очень простой пример с $ lookup.

db.getCollection('users').aggregate([
    {
        $lookup: {
            from: "userinfo",
            localField: "userId",
            foreignField: "userId",
            as: "userInfoData"
        }
    },
    {
        $lookup: {
            from: "userrole",
            localField: "userId",
            foreignField: "userId",
            as: "userRoleData"
        }
    },
    { $unwind: { path: "$userInfoData", preserveNullAndEmptyArrays: true }},
    { $unwind: { path: "$userRoleData", preserveNullAndEmptyArrays: true }}
])

Здесь используется

 { $unwind: { path: "$userInfoData", preserveNullAndEmptyArrays: true }}, 
 { $unwind: { path: "$userRoleData", preserveNullAndEmptyArrays: true }}

Вместо

{ $unwind:"$userRoleData"} 
{ $unwind:"$userRoleData"}

Поскольку {$ разматывать: «$ userRoleData»} это вернет пустой или 0 результат, если совпадающая запись не найдена с $ lookup.

7
ответ дан Anish Agarwal 19 August 2018 в 15:11
поделиться

Если в mongodb нет объемной вставки, мы зацикливаем все объекты в small_collection и вставляем их один за другим в big_collection:

db.small_collection.find().forEach(function(obj){ 
   db.big_collection.insert(obj)
});
11
ответ дан Hieu Le 19 August 2018 в 15:11
поделиться

Несмотря на то, что вы не можете делать это в режиме реального времени, вы можете запускать несколько сокращений карт для объединения данных вместе с помощью опции «уменьшить» в MongoDB 1.8+ map / reduce (см. http: // www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions). Вам нужно иметь некоторый ключ в обеих коллекциях, который вы можете использовать в качестве _id.

Например, предположим, что у вас есть коллекция users и comments, и вы хотите иметь новую коллекцию который имеет некоторую демографическую информацию пользователя для каждого комментария.

Предположим, что коллекция users имеет следующие поля:

  • _id
  • firstName
  • lastName
  • страна
  • пол
  • возраст

И тогда коллекция comments имеет следующие поля:

  • _id
  • userId
  • комментарий
  • created

Вы сделал бы это map / reduce:

var mapUsers, mapComments, reduce;
db.users_comments.remove();

// setup sample data - wouldn't actually use this in production
db.users.remove();
db.comments.remove();
db.users.save({firstName:"Rich",lastName:"S",gender:"M",country:"CA",age:"18"});
db.users.save({firstName:"Rob",lastName:"M",gender:"M",country:"US",age:"25"});
db.users.save({firstName:"Sarah",lastName:"T",gender:"F",country:"US",age:"13"});
var users = db.users.find();
db.comments.save({userId: users[0]._id, "comment": "Hey, what's up?", created: new ISODate()});
db.comments.save({userId: users[1]._id, "comment": "Not much", created: new ISODate()});
db.comments.save({userId: users[0]._id, "comment": "Cool", created: new ISODate()});
// end sample data setup

mapUsers = function() {
    var values = {
        country: this.country,
        gender: this.gender,
        age: this.age
    };
    emit(this._id, values);
};
mapComments = function() {
    var values = {
        commentId: this._id,
        comment: this.comment,
        created: this.created
    };
    emit(this.userId, values);
};
reduce = function(k, values) {
    var result = {}, commentFields = {
        "commentId": '', 
        "comment": '',
        "created": ''
    };
    values.forEach(function(value) {
        var field;
        if ("comment" in value) {
            if (!("comments" in result)) {
                result.comments = [];
            }
            result.comments.push(value);
        } else if ("comments" in value) {
            if (!("comments" in result)) {
                result.comments = [];
            }
            result.comments.push.apply(result.comments, value.comments);
        }
        for (field in value) {
            if (value.hasOwnProperty(field) && !(field in commentFields)) {
                result[field] = value[field];
            }
        }
    });
    return result;
};
db.users.mapReduce(mapUsers, reduce, {"out": {"reduce": "users_comments"}});
db.comments.mapReduce(mapComments, reduce, {"out": {"reduce": "users_comments"}});
db.users_comments.find().pretty(); // see the resulting collection

На этом этапе у вас будет новая коллекция под названием users_comments, которая содержит объединенные данные, и теперь вы можете ее использовать. Эти уменьшенные коллекции имеют _id, который является ключом, который вы излучали в ваших функциях карты, а затем все значения являются под-объектом внутри клавиши value - значения не находятся на верхнем уровне этих сокращенных документов .

Это несколько простой пример. Вы можете повторить это с большим количеством коллекций столько, сколько хотите продолжать наращивать уменьшенную коллекцию. Вы также можете делать сводки и агрегации данных в процессе. Вероятно, вы бы определили более одной функции сокращения, так как логика для агрегирования и сохранения существующих полей становится более сложной.

Вы также заметите, что теперь есть один документ для каждого пользователя со всеми комментариями этого пользователя в массив. Если бы мы объединили данные, которые имеют отношения «один к одному», а не «один ко многим», это было бы неплохо, и вы могли бы просто использовать функцию уменьшения следующим образом:

reduce = function(k, values) {
    var result = {};
    values.forEach(function(value) {
        var field;
        for (field in value) {
            if (value.hasOwnProperty(field)) {
                result[field] = value[field];
            }
        }
    });
    return result;
};

Если вы хотите чтобы сгладить коллекцию users_comments, так что это один документ за комментарий, дополнительно выполните это:

var map, reduce;
map = function() {
    var debug = function(value) {
        var field;
        for (field in value) {
            print(field + ": " + value[field]);
        }
    };
    debug(this);
    var that = this;
    if ("comments" in this.value) {
        this.value.comments.forEach(function(value) {
            emit(value.commentId, {
                userId: that._id,
                country: that.value.country,
                age: that.value.age,
                comment: value.comment,
                created: value.created,
            });
        });
    }
};
reduce = function(k, values) {
    var result = {};
    values.forEach(function(value) {
        var field;
        for (field in value) {
            if (value.hasOwnProperty(field)) {
                result[field] = value[field];
            }
        }
    });
    return result;
};
db.users_comments.mapReduce(map, reduce, {"out": "comments_with_demographics"});

Этот метод определенно не должен выполняться «на лету». Он подходит для задания cron или что-то вроде этого, которое периодически обновляет объединенные данные. Вероятно, вы захотите запустить ensureIndex в новой коллекции, чтобы убедиться, что запросы, которые вы выполняете против этого, выполняются быстро (помните, что ваши данные все еще находятся внутри клавиши value, поэтому, если вы хотите индексировать comments_with_demographics на время комментария created, это будет db.comments_with_demographics.ensureIndex({"value.created": 1});

126
ответ дан jasonszhao 19 August 2018 в 15:11
поделиться
  • 1
    Я бы, вероятно, никогда не делал этого в программном обеспечении для производства, но это по-прежнему злая крутая техника. – Dave Griffith 5 January 2012 в 20:02
  • 2
    Спасибо, Дэйв. Я использовал этот метод для создания таблиц экспорта и отчетности для сайта с высоким трафиком в производстве в течение последних 3 месяцев без проблем. Вот еще одна статья, описывающая аналогичное использование метода: tebros.com/2011/07/… – rmarscher 6 January 2012 в 17:53
  • 3
    Благодаря @rmarscher ваши дополнительные данные действительно помогли мне лучше понять все. – benstr 10 November 2014 в 22:29
  • 4
    Я должен обновить этот ответ с помощью примера, используя конвейер агрегации и новую операцию поиска $. Упоминаю его здесь, пока я не смогу составить надлежащую рецензию. docs.mongodb.org/manual/reference/operator/aggregation/lookup – rmarscher 9 January 2016 в 18:46
  • 5
    FYI для тех, кто хочет быстро понять, что это делает, вот что находится в коллекции users_comments после первого блока кода gist.github.com/nolanamy/83d7fb6a9bf92482a1c4311ad9c78835 – Nolan Amy 27 September 2016 в 22:51

используют несколько $ lookup для нескольких коллекций в агрегировании

query:

db.getCollection('servicelocations').aggregate([
  {
    $match: {
      serviceLocationId: {
        $in: ["36728"]
      }
    }
  },
  {
    $lookup: {
      from: "orders",
      localField: "serviceLocationId",
      foreignField: "serviceLocationId",
      as: "orders"
    }
  },
  {
    $lookup: {
      from: "timewindowtypes",
      localField: "timeWindow.timeWindowTypeId",
      foreignField: "timeWindowTypeId",
      as: "timeWindow"
    }
  },
  {
    $lookup: {
      from: "servicetimetypes",
      localField: "serviceTimeTypeId",
      foreignField: "serviceTimeTypeId",
      as: "serviceTime"
    }
  },
  {
    $unwind: "$orders"
  },
  {
    $unwind: "$serviceTime"
  },
  {
    $limit: 14
  }
])

result:

{
    "_id" : ObjectId("59c3ac4bb7799c90ebb3279b"),
    "serviceLocationId" : "36728",
    "regionId" : 1.0,
    "zoneId" : "DXBZONE1",
    "description" : "AL HALLAB REST EMIRATES MALL",
    "locationPriority" : 1.0,
    "accountTypeId" : 1.0,
    "locationType" : "SERVICELOCATION",
    "location" : {
        "makani" : "",
        "lat" : 25.119035,
        "lng" : 55.198694
    },
    "deliveryDays" : "MTWRFSU",
    "timeWindow" : [ 
        {
            "_id" : ObjectId("59c3b0a3b7799c90ebb32cde"),
            "timeWindowTypeId" : "1",
            "Description" : "MORNING",
            "timeWindow" : {
                "openTime" : "06:00",
                "closeTime" : "08:00"
            },
            "accountId" : 1.0
        }, 
        {
            "_id" : ObjectId("59c3b0a3b7799c90ebb32cdf"),
            "timeWindowTypeId" : "1",
            "Description" : "MORNING",
            "timeWindow" : {
                "openTime" : "09:00",
                "closeTime" : "10:00"
            },
            "accountId" : 1.0
        }, 
        {
            "_id" : ObjectId("59c3b0a3b7799c90ebb32ce0"),
            "timeWindowTypeId" : "1",
            "Description" : "MORNING",
            "timeWindow" : {
                "openTime" : "10:30",
                "closeTime" : "11:30"
            },
            "accountId" : 1.0
        }
    ],
    "address1" : "",
    "address2" : "",
    "phone" : "",
    "city" : "",
    "county" : "",
    "state" : "",
    "country" : "",
    "zipcode" : "",
    "imageUrl" : "",
    "contact" : {
        "name" : "",
        "email" : ""
    },
    "status" : "ACTIVE",
    "createdBy" : "",
    "updatedBy" : "",
    "updateDate" : "",
    "accountId" : 1.0,
    "serviceTimeTypeId" : "1",
    "orders" : [ 
        {
            "_id" : ObjectId("59c3b291f251c77f15790f92"),
            "orderId" : "AQ18O1704264",
            "serviceLocationId" : "36728",
            "orderNo" : "AQ18O1704264",
            "orderDate" : "18-Sep-17",
            "description" : "AQ18O1704264",
            "serviceType" : "Delivery",
            "orderSource" : "Import",
            "takenBy" : "KARIM",
            "plannedDeliveryDate" : ISODate("2017-08-26T00:00:00.000Z"),
            "plannedDeliveryTime" : "",
            "actualDeliveryDate" : "",
            "actualDeliveryTime" : "",
            "deliveredBy" : "",
            "size1" : 296.0,
            "size2" : 3573.355,
            "size3" : 240.811,
            "jobPriority" : 1.0,
            "cancelReason" : "",
            "cancelDate" : "",
            "cancelBy" : "",
            "reasonCode" : "",
            "reasonText" : "",
            "status" : "",
            "lineItems" : [ 
                {
                    "ItemId" : "BNWB020",
                    "size1" : 15.0,
                    "size2" : 78.6,
                    "size3" : 6.0
                }, 
                {
                    "ItemId" : "BNWB021",
                    "size1" : 20.0,
                    "size2" : 252.0,
                    "size3" : 11.538
                }, 
                {
                    "ItemId" : "BNWB023",
                    "size1" : 15.0,
                    "size2" : 285.0,
                    "size3" : 16.071
                }, 
                {
                    "ItemId" : "CPMW112",
                    "size1" : 3.0,
                    "size2" : 25.38,
                    "size3" : 1.731
                }, 
                {
                    "ItemId" : "MMGW001",
                    "size1" : 25.0,
                    "size2" : 464.375,
                    "size3" : 46.875
                }, 
                {
                    "ItemId" : "MMNB218",
                    "size1" : 50.0,
                    "size2" : 920.0,
                    "size3" : 60.0
                }, 
                {
                    "ItemId" : "MMNB219",
                    "size1" : 50.0,
                    "size2" : 630.0,
                    "size3" : 40.0
                }, 
                {
                    "ItemId" : "MMNB220",
                    "size1" : 50.0,
                    "size2" : 416.0,
                    "size3" : 28.846
                }, 
                {
                    "ItemId" : "MMNB270",
                    "size1" : 50.0,
                    "size2" : 262.0,
                    "size3" : 20.0
                }, 
                {
                    "ItemId" : "MMNB302",
                    "size1" : 15.0,
                    "size2" : 195.0,
                    "size3" : 6.0
                }, 
                {
                    "ItemId" : "MMNB373",
                    "size1" : 3.0,
                    "size2" : 45.0,
                    "size3" : 3.75
                }
            ],
            "accountId" : 1.0
        }, 
        {
            "_id" : ObjectId("59c3b291f251c77f15790f9d"),
            "orderId" : "AQ137O1701240",
            "serviceLocationId" : "36728",
            "orderNo" : "AQ137O1701240",
            "orderDate" : "18-Sep-17",
            "description" : "AQ137O1701240",
            "serviceType" : "Delivery",
            "orderSource" : "Import",
            "takenBy" : "KARIM",
            "plannedDeliveryDate" : ISODate("2017-08-26T00:00:00.000Z"),
            "plannedDeliveryTime" : "",
            "actualDeliveryDate" : "",
            "actualDeliveryTime" : "",
            "deliveredBy" : "",
            "size1" : 28.0,
            "size2" : 520.11,
            "size3" : 52.5,
            "jobPriority" : 1.0,
            "cancelReason" : "",
            "cancelDate" : "",
            "cancelBy" : "",
            "reasonCode" : "",
            "reasonText" : "",
            "status" : "",
            "lineItems" : [ 
                {
                    "ItemId" : "MMGW001",
                    "size1" : 25.0,
                    "size2" : 464.38,
                    "size3" : 46.875
                }, 
                {
                    "ItemId" : "MMGW001-F1",
                    "size1" : 3.0,
                    "size2" : 55.73,
                    "size3" : 5.625
                }
            ],
            "accountId" : 1.0
        }, 
        {
            "_id" : ObjectId("59c3b291f251c77f15790fd8"),
            "orderId" : "AQ110O1705036",
            "serviceLocationId" : "36728",
            "orderNo" : "AQ110O1705036",
            "orderDate" : "18-Sep-17",
            "description" : "AQ110O1705036",
            "serviceType" : "Delivery",
            "orderSource" : "Import",
            "takenBy" : "KARIM",
            "plannedDeliveryDate" : ISODate("2017-08-26T00:00:00.000Z"),
            "plannedDeliveryTime" : "",
            "actualDeliveryDate" : "",
            "actualDeliveryTime" : "",
            "deliveredBy" : "",
            "size1" : 60.0,
            "size2" : 1046.0,
            "size3" : 68.0,
            "jobPriority" : 1.0,
            "cancelReason" : "",
            "cancelDate" : "",
            "cancelBy" : "",
            "reasonCode" : "",
            "reasonText" : "",
            "status" : "",
            "lineItems" : [ 
                {
                    "ItemId" : "MMNB218",
                    "size1" : 50.0,
                    "size2" : 920.0,
                    "size3" : 60.0
                }, 
                {
                    "ItemId" : "MMNB219",
                    "size1" : 10.0,
                    "size2" : 126.0,
                    "size3" : 8.0
                }
            ],
            "accountId" : 1.0
        }
    ],
    "serviceTime" : {
        "_id" : ObjectId("59c3b07cb7799c90ebb32cdc"),
        "serviceTimeTypeId" : "1",
        "serviceTimeType" : "nohelper",
        "description" : "",
        "fixedTime" : 30.0,
        "variableTime" : 0.0,
        "accountId" : 1.0
    }
}
3
ответ дан KARTHIKEYAN.A 19 August 2018 в 15:11
поделиться

Вы должны сделать это на своем прикладном уровне. Если вы используете ORM, он может использовать аннотации (или что-то подобное), чтобы вытащить ссылки, которые существуют в других коллекциях. Я работал с Morphia , а аннотация @Reference извлекает связанный объект при запросе, поэтому я могу избежать этого сам в коде.

-1
ответ дан lobster1234 19 August 2018 в 15:11
поделиться
  • 1
    Агрегация и сокращение карты могут быть сделаны. – Maxwell s.c 27 September 2017 в 12:17

Да, вы можете: взять эту служебную функцию, которую я написал сегодня:

function shangMergeCol() {
  tcol= db.getCollection(arguments[0]);
  for (var i=1; i<arguments.length; i++){
    scol= db.getCollection(arguments[i]);
    scol.find().forEach(
        function (d) {
            tcol.insert(d);
        }
    )
  }
}

Вы можете передать этой функции любое количество коллекций, первое из которых будет целевым. Все остальные коллекции являются источниками, которые должны быть перенесены на целевую.

0
ответ дан Shangab 19 August 2018 в 15:11
поделиться

MongoDB 3.2 теперь позволяет объединять данные из нескольких коллекций в один через $ этап агрегации поиска . В качестве практического примера можно сказать, что у вас есть данные о книгах, разделенных на две разные коллекции.

Первая коллекция, называемая books, имеющая следующие данные:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe"
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe"
}

И второй сбор, называемый books_selling_data, имеющий следующие данные:

{
    "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
    "isbn": "978-3-16-148410-0",
    "copies_sold": 12500
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d28"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 720050
}
{
    "_id": ObjectId("56e31ce076cdf52e541d9d29"),
    "isbn": "978-3-16-148999-9",
    "copies_sold": 1000
}

Чтобы объединить обе коллекции, просто нужно использовать $ lookup следующим образом:

db.books.aggregate([{
    $lookup: {
            from: "books_selling_data",
            localField: "isbn",
            foreignField: "isbn",
            as: "copies_sold"
        }
}])

После этой агрегации коллекция books будет выглядеть следующим образом:

{
    "isbn": "978-3-16-148410-0",
    "title": "Some cool book",
    "author": "John Doe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31bcf76cdf52e541d9d26"),
            "isbn": "978-3-16-148410-0",
            "copies_sold": 12500
        }
    ]
}
{
    "isbn": "978-3-16-148999-9",
    "title": "Another awesome book",
    "author": "Jane Roe",
    "copies_sold": [
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 720050
        },
        {
            "_id": ObjectId("56e31ce076cdf52e541d9d28"),
            "isbn": "978-3-16-148999-9",
            "copies_sold": 1000
        }
    ]
}

Важно отметить несколько вещей:

  1. Коллекция «из» , в этом случае books_selling_data не может быть оговорено.
  2. Поле «as» будет массивом, как пример выше.
  3. Опции «localField» и «foreignField» на этапе поиска $ будут считаться нулевыми для целей сопоставления, если они не существуют в их соответствующих коллекциях (в этом случае $ lookup docs имеет прекрасный пример).

Итак, в качестве вывода, если вы хотите объединить обе коллекции, имея в данном случае плоский copy_sold поле с полными проданными копиями, вам придется немного поработать, возможно, используя промежуточную коллекцию, которая затем будет $ out до окончательной коллекции.

90
ответ дан Tom Krones 19 August 2018 в 15:11
поделиться
  • 1
    привет, пожалуйста, вы можете рассказать, каким будет оптимизированный способ управления данными, подобным этому: пользовательские, file.files и file.chunks - это три коллекции, я хочу, чтобы конкретный пользователь со всем связанным с ним файлом в ответ был возможен.? {& quot; имя & quot; : "batMan", "email": "bt@gmail.com" ;," files & quot; : [{file1}, {file2}, {file3}, .... so on]} – Muhammad Faisal Hyder 19 May 2016 в 09:53
  • 2
    Примеры официальной документации для вышеупомянутого решения можно найти здесь: docs.mongodb.com/manual/reference/operator/aggregation/lookup – Jakub Czaplicki 17 June 2016 в 11:38
  • 3
    Ну, на самом деле мой ответ уже имел три ссылки на официальную документацию. Но спасибо за ваш вклад. @JakubCzaplicki – Bruno Krebs 19 June 2016 в 14:00
  • 4
    У меня может быть полная неисправность мозга (скорее всего), но в $lookup должны быть не все оба "localField" и "foreignField" равный "isbn"? не "_id" и "isbn"? – Tom Krones 31 August 2016 в 14:44
  • 5
    Похоже, вы правы @TomKrones – Bruno Krebs 31 August 2016 в 15:14

У Mongorestore есть эта возможность добавления поверх того, что уже есть в базе данных, поэтому это поведение можно было бы использовать для объединения двух коллекций:

  1. mongodump collection1
  2. collection2 .rename (collection1)
  3. mongorestore

Еще не пробовал, но может работать быстрее, чем подход map / reduce.

2
ответ дан Unihedron 19 August 2018 в 15:11
поделиться

Фрагмент кода. Courtesy - несколько сообщений о переполнении стека, включая этот.

 db.cust.drop();
 db.zip.drop();
 db.cust.insert({cust_id:1, zip_id: 101});
 db.cust.insert({cust_id:2, zip_id: 101});
 db.cust.insert({cust_id:3, zip_id: 101});
 db.cust.insert({cust_id:4, zip_id: 102});
 db.cust.insert({cust_id:5, zip_id: 102});

 db.zip.insert({zip_id:101, zip_cd:'AAA'});
 db.zip.insert({zip_id:102, zip_cd:'BBB'});
 db.zip.insert({zip_id:103, zip_cd:'CCC'});

mapCust = function() {
    var values = {
        cust_id: this.cust_id
    };
    emit(this.zip_id, values);
};

mapZip = function() {
    var values = {
    zip_cd: this.zip_cd
    };
    emit(this.zip_id, values);
};

reduceCustZip =  function(k, values) {
    var result = {};
    values.forEach(function(value) {
    var field;
        if ("cust_id" in value) {
            if (!("cust_ids" in result)) {
                result.cust_ids = [];
            }
            result.cust_ids.push(value);
        } else {
    for (field in value) {
        if (value.hasOwnProperty(field) ) {
                result[field] = value[field];
        }
         };  
       }
      });
       return result;
};


db.cust_zip.drop();
db.cust.mapReduce(mapCust, reduceCustZip, {"out": {"reduce": "cust_zip"}});
db.zip.mapReduce(mapZip, reduceCustZip, {"out": {"reduce": "cust_zip"}});
db.cust_zip.find();


mapCZ = function() {
    var that = this;
    if ("cust_ids" in this.value) {
        this.value.cust_ids.forEach(function(value) {
            emit(value.cust_id, {
                zip_id: that._id,
                zip_cd: that.value.zip_cd
            });
        });
    }
};

reduceCZ = function(k, values) {
    var result = {};
    values.forEach(function(value) {
        var field;
        for (field in value) {
            if (value.hasOwnProperty(field)) {
                result[field] = value[field];
            }
        }
    });
    return result;
};
db.cust_zip_joined.drop();
db.cust_zip.mapReduce(mapCZ, reduceCZ, {"out": "cust_zip_joined"}); 
db.cust_zip_joined.find().pretty();


var flattenMRCollection=function(dbName,collectionName) {
    var collection=db.getSiblingDB(dbName)[collectionName];

    var i=0;
    var bulk=collection.initializeUnorderedBulkOp();
    collection.find({ value: { $exists: true } }).addOption(16).forEach(function(result) {
        print((++i));
        //collection.update({_id: result._id},result.value);

        bulk.find({_id: result._id}).replaceOne(result.value);

        if(i%1000==0)
        {
            print("Executing bulk...");
            bulk.execute();
            bulk=collection.initializeUnorderedBulkOp();
        }
    });
    bulk.execute();
};


flattenMRCollection("mydb","cust_zip_joined");
db.cust_zip_joined.find().pretty();
0
ответ дан Vipul Mehta 19 August 2018 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: