javascript - 分割文档并插入为多个的转换

标签 javascript node.js marklogic marklogic-8 marklogic-9

我发现通过 MLCP 实现这一点的唯一方法是,转换必须返回格式为 [{"uri": "some_uri1", "value": "newly_created_doc1"},{"uri": "some_uri2"的数组“,“值”:“newly_created_doc2”}]。这样,在使用内容泵进行转换后,将根据某些原始文档创建这两个文档。我的问题是如何通过node.js api 或java api 实现相同的结果。例如,使用 node.js,我可以应用转换,并将此文件创建为具有上述样式数组的单个文档。

我的转变:

const common = require("/ext/home/common.sjs");

function createDocs(content, context) {

    var bets = content.value.xpath('//selections').toArray();
    var documents = [];

    for (var bet in bets) {
        var bookie_name = "Boylesports";
        var sport_name = "Football";
        var event_name = bets[bet].xpath('../../../../name').toString();

        if (/^Over \d+\.\d+$/.test(event_name)) {
            event_name = event_name.replace(/^Over (\d+)\.\d+$/, 1);
        } else {
            event_name;
        }

        var subevent_name = bets[bet].xpath('../../../../name').toString();

        if (/^Over \d+\.\d+$/.test(subevent_name)) {
            subevent_name = subevent_name.replace(/^Over (\d+)\.\d+$/, 1);
        }
        else {
            subevent_name;
        }

        var subevent_id = bets[bet].xpath('../../../../idfoevent');
        var start_date = xdmp.parseDateTime("[Y0001]-[M01]-[D01]T[h01]:[m01]:[s01]", bets[bet].xpath('../../../../tsstart'));
        // var start_date = "2017-10-21T13:00:00Z";

        var market_name = bets[bet].xpath('../../name').toString();

        if (/^Handicap.+$/.test(market_name)) {
            market_name = market_name.replace(/^Handicap.+$/, "Handicaps");
        }
        if (/^Match Betting$/.test(market_name)) {
            market_name = market_name.replace(/^Match Betting$/, "Win Market");
        }
        else {
            market_name;
        }

        var market_id = bets[bet].xpath('../../idfomarket');
        var bet_name = bets[bet].xpath('name').toString();

        if (/^Aston Villa$/.test(bet_name)) {
            bet_name = bet_name.replace(/^Aston (Villa)$/, 1);
        }
        else {
            bet_name;
        }

        var bet_id = bets[bet].xpath('idfoselection');


        //Push to the list of documents
        var document = {};
        document.uri = common.convertToSlug(sport_name) + '/' + common.convertToSlug(event_name) + '/' + common.convertToSlug(subevent_name) + '/' + common.convertToSlug(market_name) + '/' + common.convertToSlug(bet_name);
        document.value = {
            'bookie_name': bookie_name,
            'sport_name': sport_name,
            'sport_slug': common.convertToSlug(sport_name),
            'event_name': event_name,
            'event_slug': common.convertToSlug(event_name),
            'subevent_name': subevent_name,
            'subevent_slug': common.convertToSlug(subevent_name),
            'subevent_id': subevent_id,
            'start_date': start_date,
            'market_name': market_name,
            'market_slug': common.convertToSlug(market_name),
            'market_id': market_id,
            'bet_name': bet_name,
            'bet_slug': common.convertToSlug(bet_name),
            'bet_id': bet_id
        };

        //Checks if objects with the same uri exist before pushing them
        if (documents.findIndex(x => x.uri == document.uri) === -1) documents.push(document);

        // documents.push(document);
    }
    return Sequence.from(documents);
}; 

exports.transform = createDocs;

我在node.js中的使用:

const axios = require("axios");
const db_client = require("../../database/connect").dbWriter;


axios.get("http://cache.boylesports.com/feeds/EUROFOOT2.json")
    .then(function (response) {
        console.log(response.data);

        var documents = [{uri: "http://cache.boylesports.com/feeds/EUROFOOT2.json",
                          content: response.data,
                          contentType: 'application/json',
                          collections: ["test"]}];



        db_client.documents.write({documents: documents, transform: ['js-example']}).result(
        function (response) {
            response.documents.forEach(function (document) {
                console.log('LOADED: ' + document.uri);
            });
        },
        function (error) {
            console.log(error);
        }
    );

    })
    .catch(function (error) {
        console.log(error);
    });

最佳答案

客户端 API 依赖于 REST 转换,不支持相同类型的多个文档拆分。我本来希望说您可以使用 DMSDK,但看起来它依赖于相同类型的转换。这是上传到数据库后转换文档的示例:

http://docs.marklogic.com/guide/java/data-movement#id_22702

看来您必须违背建议,并通过直接执行 xdmp:document-insert 调用创建一个会导致副作用的转换。

呵呵!

关于javascript - 分割文档并插入为多个的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49083776/

相关文章:

javascript - 按需加载选项卡和表单提交的最佳方法

node.js - Mongoose只保存对象_id值的数组

xml - 多个重复字段上的 MarkLogic TDE xpath

marklogic - 如何在marklogic服务器中编写保留策略以将当前版本与其旧版本分离到不同的集合中?

marklogic - 如何查询 MarkLogic 以确定重新索引的成本?

javascript - 有没有更好的方法在一个 html 页面上多次运行 JavaScript?

javascript - 需要关于如何在 JavaScript 中分解非常大的数字的提示/建议

javascript - Angular ui-router 和具有嵌套状态的后退按钮

node.js - Loopback JS 全局错误日志记录

javascript - 使用 NodeJs 和 MongoDB 存储事件的最佳实践是什么