环回将字符串推送到数组

时间:2018-08-06 09:30:49

标签: node.js mongodb mongodb-query loopbackjs

我的问题与this question asked in 2016相似,很遗憾,该问题没有可接受的答案。我也无法使用那里的答案来弄清楚我需要如何完成同样的任务。

我基本上是在尝试向数据模型中的数组添加新项。

我当前的数据模型(我想要的)是这样的:

{
   teamId: 'team32',
   teamName: 'Lions',
   players: ['Jack','Ryan','Sam']
}

创建新团队时,将为“玩家”添加一个空数组。没有适合玩家的模型。它只是一个可以容纳玩家列表的数组。

如何将新玩家添加到玩家列表中(在列表中添加字符串)?我也愿意将其存储为对象而不是字符串。

我的团队模型

{
  "name": "teams",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "teamID": {
      "type": "string",
      "required": true
    },
    "teamName": {
      "type": "string",
      "required": true
    },
    "players":{
      "type":"array",
    }
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": {}
}

team.js

var updateQuery = {players:{$addToSet:{'Mark'}}};

team.update({teamID:'teams32'},updateQuery,
     function(err,data){
         console.log(err,data,'result');
      });

$ addToSet和$ push在MongoDB和mongoose上都为我工作。但是似乎在环回上似乎不起作用。因为$ addToSet和$ push在这种情况下都不适合我,我该怎么办?

4 个答案:

答案 0 :(得分:1)

这值得打两个电话,但可能会为您提供帮助:

team.addPlayer = function (player, cb) {
    team.findOne({where: {teamID: "teams32"}}, function (err, team) {
        if (!err && team) {
            var players = [];
            if (team.players) {
                players = team.players;
            }
            players.push(player);
            team.updateAttributes({players: players}, function(err, team) {
                cb (err, team);
            });
        } else {
            cb (err, {});
        }
    });
};

team.remoteMethod('addPlayer', {
    accepts: {arg: 'player', type: 'string', required: true},
    returns: {arg: 'team', type: 'object'},
    http: {verb: 'put'}
});

答案 1 :(得分:1)

您应该扩展模型功能以使用那些运算符。 像这样:

"options": {    
    "mongodb": {
      "collection": "model_collection",
      "allowExtendedOperators": true
    }
  },

如回送文档所述:https://loopback.io/doc/en/lb2/MongoDB-connector.html

然后您可以像使用它一样

team.update({teamID:'teams32'},{ $addToSet:{ players: 'Mark'}},
     function(err,data){
         console.log(err,data,'result');
      });

答案 2 :(得分:0)

据我所知,回送中的查找,更新和任何其他功能与MongoDB本机查询不同。它有自己的自定义项。所以 team.update db.team.update()不同。 因此,您可以使用上一个答案中所述的2个数据库查询,也可以尝试通过获取数据源来运行本机查询。然后,您可以轻松使用 $ addToSet ,它将在一次点击中完成工作。

team.getDataSource().connector.connect(function (err, db) {
    var collection = db.collection("team");
    collection.update(filter,{$addToSet: {players:{$addToSet:{'Mark'}}}}, function(err,res){ /*Anything you want to do here*/ })
})

这可能有帮助。

答案 3 :(得分:0)

我刚刚使用节点--version v10.16.0和loopback@3.26.0实现了该端点

有了它,我可以将值追加到模型中的任何字段(当前仅处理数组类型字段)。数据参数应该看起来像[ "one", 2, true ]

    Dataset.appendToArrayField = function (id, fieldName, data, ctx, next) {
    const where = {pid: id};
    var $addToSet = {};
    // $each is necessary as data is an array of values
    // $addToSetis necessary to append to the field and not overwrite
    $addToSet[fieldName] = { $each: data };
    Dataset.update(where,  { $addToSet });
    next();
};

Dataset.remoteMethod("appendToArrayField", {
    accepts: [{
            arg: "id",
            type: "string",
            required: true,
            description: ""
        },
        {
            arg: "fieldName",
            type: "string",
            required: true,
            description: "Name of field to append data to"
        },
        {
            arg: "data",
            type: "array",
            required: true,
            description: "An array of values to append"
        },
        {
            arg: 'options',
            type: 'object',
            http: {
                source: 'context'
            }
        }
    ],
    http: {
        path: "/appendToArrayField",
        verb: "post"
    },
    returns: {
        type: "Object",
        root: true
    },
    description: "updates a single record by appending data to the specified field"
});