Что лучший способ состоит в том, чтобы выполнить Wordpress на том же домене как приложение направляющих?

Лучший способ сделать это - использовать структуру агрегации для вычисления нашего нового поля.

MongoDB 3.4

Наиболее эффективное решение в MongoDB 3.4 с помощью $addFields и $out операторов конвейерной агрегации.

db.collection.aggregate(
    [
        { "$addFields": { 
            "name": { "$concat": [ "$firstName", " ", "$lastName" ] } 
        }},
        { "$out": "collection" }
    ]
)

Обратите внимание, что это не обновляет вашу коллекцию, а вместо этого заменяет существующую коллекцию или создает новый. Также для операций обновления, для которых требуется «литье типов», вам потребуется обработка на стороне клиента, и в зависимости от операции вам может понадобиться использовать метод find() вместо метода .aggreate().

MongoDB 3.2 и 3.0

. Мы делаем это с помощью $project наших документов и используем оператор агрегации строк $concat для возврата конкатенированной строки , we Оттуда вы затем перебираете курсор и используете оператор обновления $set , чтобы добавить новое поле в ваши документы, используя массовые операции для максимальная эффективность.

Запрос на агрегирование:

var cursor = db.collection.aggregate([ 
    { "$project":  { 
        "name": { "$concat": [ "$firstName", " ", "$lastName" ] } 
    }}
])

MongoDB 3.2 или новее

из этого, вам нужно использовать bulkWrite .

var requests = [];
cursor.forEach(document => { 
    requests.push( { 
        'updateOne': {
            'filter': { '_id': document._id },
            'update': { '$set': { 'name': document.name } }
        }
    });
    if (requests.length === 500) {
        //Execute per 500 operations and re-init
        db.collection.bulkWrite(requests);
        requests = [];
    }
});

if(requests.length > 0) {
     db.collection.bulkWrite(requests);
}

MongoDB 2.6 и 3.0

В этой версии вам необходимо использовать устаревший API Bulk и его связанные методы .

var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;

cursor.snapshot().forEach(function(document) { 
    bulk.find({ '_id': document._id }).updateOne( {
        '$set': { 'name': document.name }
    });
    count++;
    if(count%500 === 0) {
        // Excecute per 500 operations and re-init
        bulk.execute();
        bulk = db.collection.initializeUnorderedBulkOp();
    }
})

// clean up queues
if(count > 0) {
    bulk.execute();
}

MongoDB 2.4

cursor["result"].forEach(function(document) {
    db.collection.update(
        { "_id": document._id }, 
        { "$set": { "name": document.name } }
    );
})

12
задан Brian Deterling 18 September 2008 в 02:33
поделиться

4 ответа

Я думаю, что решение joelhardi превосходит следующее. Однако в моем собственном приложении, мне нравится сохранять блог на отдельном VPS, чем сайт направляющих (разделение проблем памяти). Чтобы заставить пользователя видеть тот же URL, Вы используете тот же прием прокси, который Вы обычно используете для проксирования для кластера полукровки, кроме Вас прокси для портирования 80 (или безотносительно) на другом поле. Легкий peasy. Пользователю это столь же прозрачно как Вы проксирующий полукровке - они только "видят", что NGINX отвечает на порте 80 в Вашем домене.

upstream myBlogVPS {
        server 127.0.0.2:80;  #fix me to point to your blog VPS
}

 server {
    listen       80;


    #You'll have plenty of things for Rails compatibility here

    #Make sure you don't accidentally step on this with the Rails config!

    location /blog {
        proxy_pass         http://myBlogVPS;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

Можно использовать этот прием, чтобы иметь игру направляющих наряду с ЛЮБОЙ технологией сервера, которую Вы хотите, случайно. Проксируйте непосредственно к соответствующему серверу/порту, и NGINX скроет его от внешнего мира. Кроме того, так как URL будут все относиться к тому же домену, можно беспрепятственно интегрировать основанный на PHP блог, основанную на Python систему слежения и приложение для направляющих - пока Вы пишете свои URL правильно.

5
ответ дан 2 December 2019 в 21:04
поделиться

Ответы выше довольно адресуют ваш вопрос.

В качестве альтернативы FCGI можно использовать php-fpm. Документы немного редки, но это хорошо работает.

1
ответ дан 2 December 2019 в 21:04
поделиться

На самом деле, так как Вы используете Nginx, Вы уже находитесь в большой форме и не нуждаетесь в Apache.

Можно выполнить PHP через fastcgi (существуют примеры того, как сделать это в Wiki Nginx), и используйте соответствующий URL шаблон в конфигурации Nginx для направления некоторых URL к направляющим и других к PHP.

Вот является пример конфигурацией Nginx для выполнения блога WordPress через PHP fastcgi (обратите внимание, что я также вставил Nginx, эквивалентный из WordPress .htaccess, таким образом, у Вас также будут необычные URL, уже работающие с этой конфигурацией):

server {
    listen       example.com:80;
    server_name  example.com;
    charset      utf-8;
    error_log    /www/example.com/log/error.log;
    access_log   /www/example.com/log/access.log  main;
    root         /www/example.com/htdocs;

    include /www/etc/nginx/fastcgi.conf;
    fastcgi_index index.php;

    # Send *.php to PHP FastCGI on :9001
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9001;
    }

    # You could put another "location" section here to match some URLs and send
    # them to Rails. Or do it the opposite way and have "/blog/*" go to PHP
    # first and then everything else go to Rails. Whatever regexes you feel like
    # putting into "location" sections!

    location / {
        index index.html index.php;
        # URLs that don't exist go to WordPress /index.php PHP FastCGI
        if (!-e $request_filename) {
            rewrite ^.* /index.php break;
            fastcgi_pass 127.0.0.1:9001;
        }

    }
}

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

# joelhardi fastcgi.conf, see http://wiki.codemongers.com/NginxFcgiExample for source
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;

Я также, оказывается, делаю то, что предлагает Wiki Nginx, и используйте икру-fcgi от Lighttpd как мой CGI-spawner (Lighttpd является довольно быстрой компиляцией w/o странные зависимости, таким образом, быстрая и легкая вещь установить), но можно также использовать короткий сценарий оболочки/Perl для этого.

7
ответ дан 2 December 2019 в 21:04
поделиться

Кажется мне, что что-то как переписать манипулятор сделало бы то, что Вы хотите. Извините у меня больше нет деталей - просто думающий вслух :)

0
ответ дан 2 December 2019 в 21:04
поделиться
Другие вопросы по тегам:

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