Meteor Collection.insert()没有返回Id

时间:2018-02-03 02:22:06

标签: javascript mongodb meteor observable angular-meteor

我正在尝试获取新插入的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|");
                }
            });
        }

2 个答案:

答案 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|");
       }
    }
},