6

我有一个集合,其中包含带有嵌套对象数组的文档。这是填充数据库的夹具代码:

if (Parents.find().count() == 0) {
    var parentId = Parents.insert({
        name: "Parent One"
    });
    Children.insert({
        parent: parentId,
        fields: [
            {
                _id: new Meteor.Collection.ObjectID(),
                position: 3,
                name: "three"
            },
            {
                _id: new Meteor.Collection.ObjectID(),
                position: 1,
                name: "one"
            },
            {
                _id: new Meteor.Collection.ObjectID(),
                position: 2,
                name: "two"
            },

        ]
    });
}

您可能会问自己,当我可以根据名称进行更新时,为什么我什至需要 ObjectID。这是我目前正在处理的更复杂模式的简化示例,嵌套对象将动态创建,ObjectID 肯定是完成这项工作所必需的。

基本上,我需要一种方法来保存具有唯一 ID 的嵌套对象,并能够通过它们的 _id 更新字段。

这是我的方法,以及我从浏览器控制台进行的调用:

Meteor.methods({
  upChild: function( options ) {
        console.log(new Meteor.Collection.ObjectID());
        Children.update({_id: options._id, "fields._id": options.fieldId }, {$set: {"fields.$.position": options.position}}, function(error){
            if(error) {
                console.log(error);
            } else {
                console.log("success");
            }
        });
    }
});

我从控制台打来的电话:

Meteor.call('upChild', {
  _id: "5NuiSNQdNcZwau92M",
  fieldId: "9b93aa1ef3868d762b84d2f2",
  position: 1
});

这是 html 的屏幕截图,我在其中渲染了 Parents 和 Children 集合的所有数据: 在此处输入图像描述

4

2 回答 2

12

只是一个观察,因为我正在寻找如何出于类似原因在客户端生成唯一 ID。我发现调用 new Meteor.Collection.ObjectID() 正在返回一个“ObjectID("abc...")”形式的对象。通过将 Meteor.Collection.ObjectID()._str 分配给 _id,我得到了字符串为 'abc...',这正是我想要的。

我希望这会有所帮助,我很想知道是否有人有更好的方法来处理这个问题?

杰森

于 2013-11-19T14:39:50.677 回答
12

避免使用 _str,因为它将来可能会发生变化。用这个:

new Meteor.Collection.ObjectID().toHexString()或者

new Meteor.Collection.ObjectID().valueOf()


也可以使用官方随机包

Random.id()

于 2015-10-13T00:38:03.137 回答