我的问题与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在这种情况下都不适合我,我该怎么办?
答案 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"
});