2013-03-25 2 views
4

Я сделал исследование. Приносим извинения, если это дублирующий вопрос, но решения по другим вопросам были не совсем подходящими, и поэтому я задал новый вопрос.Diff() между двумя коллекциями в MongoDB

Каков наилучший способ использования Javascript для сравнения двух коллекций?

У меня есть тысячи этих заголовков в этом формате документа Монго:

{ 
    "url": "google.com", 
    "headers": { 
     "location": "http://www.google.com/", 
     "content-type": "text/html; charset=UTF-8", 
     "date": "Mon, 25 Mar 2013 18:12:08 GMT", 
     "expires": "Wed, 24 Apr 2013 18:12:08 GMT", 
     "cache-control": "public, max-age=2592000", 
     "server": "gws", 
     "content-length": "219", 
     "x-xss-protection": "1; mode=block", 
     "x-frame-options": "SAMEORIGIN" 
    } 
} 

Я провел скребок сегодня. Я бы в будущем снова запустил его и сохранил во второй коллекции. Кроме того, я хотел бы иметь возможность сравнить три конкретных объекта заголовка, и это server, x-aspnet-version и x-powered-by, и определить, есть ли целые приращения.

Каков наилучший способ перебора двух коллекций и выполнить diff()?

Я делаю это правильно? Любые предложения будут действительно оценены.

+0

Пожалуйста, добавьте дополнительные детали к вашему вопросу: я не понимаю, что вы точно сравниваете. Каждый документ из одной коллекции и каждого документа другой коллекции? Как часто и сколько документов? Имеет ли значение производительность (если да, сколько)? Что вы пробовали (вы должны опубликовать то, что вы пробовали)? – WiredPrairie

+0

Я бы хотел, чтобы каждый URL-адрес сравнивал 'server'' x-aspnet-version' 'x-powered by by с двухмесячным шагом. 'server' часто выводит информацию, такую ​​как Microsoft-IIS/7.0, версии Apache и/или nginx. Я хотел бы узнать, были ли какие-либо изменения в результате этих двухмесячных сканирований. – theGreenCabbage

+2

Покажите нам код, который вы пробовали. Похоже, что это будет очень грубая сила. Моя единственная рекомендация - использовать 'each' с меньшим размером партии, а не' toArray'. http://mongodb.github.com/node-mongodb-native/api-generated/cursor.html Или используйте 'nextObject'. – WiredPrairie

ответ

4

Несколько предложений:

Вы можете использовать комбинацию URL и дату доступ (по крайней мере, часть объекта даты и времени) в качестве _id для этих объектов, так как от того, что я могу сказать вам спланировать, чтобы очистить каждый url раз в месяц.

Пример:

{ 
    "_id": { 
     "url": "www.google.com", 
     "date": ISODate("2013-03-01"), 
    }, 
    // Other attributes 
} 

Это дает производительность, уникальность, и дивиденды запросов (см this 4sq blog post). Вы можете запросить делать что-то вроде:

db.collection.find({ 
    "_id": { 
     "$gte": { 
      "url": yourUrl, 
      "date": rangeStart 
     }, 
     "$lt": { 
      "url": yourUrl, 
      "date": rangeEnd 
     }, 
    } 
}) 

, который дает отличный, хорошо отсортированный (по URL ТОГДА по дате, которая, кажется, только то, что вы хотите) результаты. Вы также можете использовать этот индекс для выполнения закрытых запросов (над полем _id), если вы просто хотите получить хороший набор всех URL-адресов и месяцев, которые вы очистили (это может привести к тому, что вы сможете пройти каждый URL по одному за раз) ,

Если у вас есть определенные атрибуты документа, которые вы заинтересованы в сравнении (например, headers.server) и конкретное сравнение, которое вы хотите сделать для них (например, для любого увеличения числа версий), я бы использовал некоторые вроде регулярного выражения для захвата элементов, относящихся к номеру версии (быстрый и грязный может просто получить все числовые элементы) и нарисовать их для каждого URL-адреса (я предполагаю, что это позволит вам визуализировать изменения в программном обеспечении сервера с течением времени). Вы также можете легко сообщать, когда какой-либо из этих атрибутов менялся, сканируя их по порядку и выставляя какое-то событие, когда строки не были идентичны (возможно, после этого сообщают об изменении или числовой части изменения).

+0

Привет, marr75.Спасибо за ваш вклад. Я изменил свои очищенные заголовки, и теперь они находятся в формате 'url',' date', 'server',' x-aspnet-version', 'x-powered-by'. В любом случае, для чисто численных дат? Дата, которую сейчас используют, очень трудно разделить, если это правильный способ сказать это. Моя цель - установить промежуток времени между ними и сравнить 'server' с' server', 'x-aspnet-version' с' x-aspnet-version' и 'x-powered-by'. – theGreenCabbage

+0

Мне нравится внешний вид второй версии вашего примера. То, что вы пытаетесь достичь, - это '$ lt' и' $ gt', чтобы установить диапазон дат, правильно? Но как я буду продвигаться с этим примером? Например, следует ли очищать две коллекции, причем первая и вторая коллекции составляют месяцы друг от друга? Я слышал, что я должен использовать одну коллекцию, но это означает, что мне придется перестроить код моего скребка, что, возможно, не удастся из-за ограничений по времени. Я счастлив за вашу реализацию «по URL-адресу ТОГДА по дате THEN другими переменными». Это именно то, что я хотел сделать. – theGreenCabbage

+0

Но может быть, мы могли бы игнорировать «дату» как заголовок, а вместо этого просто сравнить две коллекции? – theGreenCabbage

Смежные вопросы