我正在尝试获取新插入的ID,以便我可以将Id推送到另一个集合。
根据这篇文章=> Meteor collection.insert callback to return new id此帖子=> Meteor collection.insert callback issues,我应该能够
return Collection.insert(obj);
它会将新插入的数据的ID返回给我的客户端。
相反,我得到了一个像这样的Observable:
{_isScalar: false}
_isScalar: false
__proto__:
constructor: f Object()
hasOwnProperty: f hasOwnProperty()
//many other object properties
文档似乎非常明确,我应该获得ID作为回报。这是一个错误吗? https://docs.meteor.com/api/collections.html#Mongo-Collection-insert]
我的流星版本是1.4.4.5 ...... 我已经在这个问题上工作了几天,我尝试了很多不同的ID,但我没有尝试过ID的结果。
这是我的完整代码供参考:
服务器
submitStuff: function(data): string{
var loggedInUser = Meteor.user();
if (!loggedInUser || !Roles.userIsInRole(loggedInUser,['user','admin'])){
throw new Meteor.Error("M504", "Access denied");
} else {
try{
let insertedData = null;
const model: MyModel[] = [{
data.stuff //bunch of data being inserted
}];
model.forEach((obj: MyModel) => {
insertedData = Collection.insert(obj);
});
return insertedData;
} catch(e) {
throw new Meteor.Error(e + e.reason, "|Throw new error|");
}
}
},
客户端:
Meteor.call('submitData', data, (error, value) => {
if(error){
this.errors.push(error + error.reason + "|new Error code|");
}
else{
Meteor.call('userPushId', value, (error) => { //this pushes Id onto the second collection
if(error){
this.errors.push(error + error.reason + "|new Error code|");
}
});
}
答案 0 :(得分:1)
服务器强>
// ...
try {
const myModels = [{ ...whatever }];
// I'm using map so I return an array of id's.
//your forEach about technically should end up with only one id,
// which is the last insertion
const insertedDataIds = myModels.map(model => Collection.insert(model));
// you can also write to the secondary location here with something like:
const secondaryWrite = SecondaryCollection.insert({ something: insertedDataIds });
return insertedDataId's
}
//...
<强>客户端强>
我也不知道这只是堆叠上的拼写错误,但您的Meteor.call('submitData')
应该是Meteor.call('submitStuff')
,但这可能不是您的实际问题。
答案 1 :(得分:1)
好吧,所以在搜索后我意识到我在创建一个集合而不是Mongo的常规集合时使用角度流星rxjs包来创建MongoObservable
。
因为我使用MongoObservable
并尝试在其上调用.insert()
,所以返回与常规Mongo Collection略有不同,并且将返回Observable而不是Id。 Documentation Here
如果您在收藏品名称后添加.collection
,您将获得ID,如下所示:
submitStuff: function(data): string{
var loggedInUser = Meteor.user();
if (!loggedInUser || !Roles.userIsInRole(loggedInUser,['user','admin'])){
throw new Meteor.Error("M504", "Access denied");
} else {
try{
let id = new Mongo.ObjectID();
const model: MyModel[] = [{
data.stuff //bunch of data being inserted
_id:
}];
model.forEach((obj: MyModel) => {
insertedData = Collection.collection.insert(obj); //added .collection
});
return insertedData;
} catch(e) {
throw new Meteor.Error(e + e.reason, "|Throw new error|");
}
}
},