流星方法插入不起作用(mongodb)

时间:2017-02-28 11:44:46

标签: mongodb reactjs meteor insert

我正在尝试将包含各种行数和列数的表写入数据库。为此,我有一个Criterion集合,用于保存表头和一个保存表数据的Option集合。

结构是这样的:

  • Criterion

    { { "_id" : "hId1", "name" : "Option Name", "tableId" : "tId1" }, { "_id" : "hId2", "name" : "Rent", "score" : 9, "tableId" : "tId1" }, { "_id" : "hId3", "name" : "Surface", "score" : 5, "tableId" : "tId1" }, { "_id" : "hId4", "name" : "Price", "score" : 5, "tableId" : "tId1" }, { "_id" : "hId5", "name" : "CPU", "score" : 5, "tableId" : "tId4" } etc. }

  • Option

    { { "_id" : "id1", "score" : 5, "hId1" : { "value" : "Apt 1" }, "hId2" : { "value" : "800 sqft", "score" : 1 }, "hId3" : { "value" : "$800", "score" : 3 }, etc. "tableId" : "tId1" } { "_id" : "id2", "score" : 5, "hId1" : { "value" : "Apt 2" }, "hId2" : { "value" : "780 sqft", "score" : 10 }, "hId3" : { "value" : "$700", "score" : 3 }, etc. "tableId" : "tId1" } etc. }

Criterion的第一行始终为"Option Name"。对于上面的数据,包含"tableId" = "tId1"的表格看起来像这样(tableIdheaderId是键):

| Option Name | Surface  | Price |
| =========== | ======== | ===== |
| Apt 1       | 800 sqft | $800  |
| Apt 2       | 780 sqft | $700  |

我的代码看起来像这样(imports/api/comparison.js):

/**
 * Options are for the rows
 */
export var Option = new Mongo.Collection('option');

/**
 * Criteria are the columns 
 */
export var Criterion = new Mongo.Collection('criterion');

Meteor.methods({
    'comparison.insertRow' (query, headerId, tableId, isFirst) {
        check(query, Object);
        check(headerId, String);
        check(tableId, String);
        check(isFirst, Boolean);

        if(isFirst){
            var data = {};
            data._id = headerId;
            data.tableId = tableId;
            data.name =  "Option Name";
            Criterion.insert(data);
        }

        query._id = tableId;
        Option.insert(query);
    },
});

其中isFirst是一个布尔值,表示这是否是表中的第一行。

我的查询构造如下(imports/ui/Menu/DataInsert.jsx):

    var query = {};
    query.score = // value
    // get the header separately
    query[headerId] = {
        value: //valueH from form
    };

    // Find the text field via the React ref
    for (var i = 1, len = cols.length; i < len; i++) {
        query[cols[i]._id] = {
            value: //valueV from form,
            score: //valueS from form
        };
    }

我的文件在服务器上可用,因为我在server/main.js执行此操作:import '../imports/api/comparison.js';

query插入Option没问题没问题。

为什么没有data插入CriterionisFirst = true时)?

我做了console.log(data)console.log(query),看起来像这样: Devtools picture

而db中的数据如下所示: Terminal picture

1 个答案:

答案 0 :(得分:0)

上面的@jordanwillis是正确的,这是因为我在_id上手动设置了query。我确实需要设置ID,但我需要设置tableId

所以,为了记录,这就是我所做的:

'comparison.insertRow' (query, headerId, tableId, isFirst) {
    check(query, Object);
    check(headerId, String);
    check(tableId, String);
    check(isFirst, Boolean);

    if(isFirst){
        var data = {};
        data._id = headerId;
        data.tableId = tableId;
        data.name =  "Option Name";
        Criterion.insert(data);
    }

    query.tableId = tableId;
    Option.insert(query);
},

我的外键是tableIdheaderIdquery的一部分)。