流星 Collection.insert() 不返回 Id

Meteor Collection.insert() not returning Id

我正在尝试获取新插入的 Id,以便将 Id 推送到另一个集合。

据此post => Meteor collection.insert callback to return new id and this post => Meteor collection.insert callback issues,我应该可以

return Collection.insert(obj);

然后它将return新插入数据的ID给我的客户端。

相反,我得到了一个像这样的 Observable:

    {_isScalar: false}
    _isScalar: false
    __proto__:
       constructor: f Object()
       hasOwnProperty: f hasOwnProperty()
    //many other object properties

文档似乎很清楚我应该在 return 中获取 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|");
                }
            });
        }

服务器

// ...

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') 但这可能不是您的实际问题。

好的,所以在四处搜索后我意识到我在创建集合时使用 angular-meteors rxjs 包来创建 MongoObservable 而不是 Mongo 的常规集合。

因为我正在使用 MongoObservable 并尝试在其上调用 .insert(),所以 return 与常规 Mongo 集合有点不同,并且 return 一个 Observable 而不是 Id。 Documentation Here

如果您在集合名称后添加 .collection,您将在 return 中获得 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|");
       }
    }
},