mongoDB将ObjectId添加到没有一个对象的数组对象中

时间:2019-01-14 22:08:53

标签: mongodb

我有一个集合,该集合的字段是对象数组... 我想为每个对象添加一个ObjectId,以便更轻松地操作数组-无需每次都循环。

我该怎么做?

我的收藏集如下

people: {
    name: "Bob",
    shirts: [
        {
            type: "Tshirt",
            size: "xl",
            color: "Red"
        },          
        {
            type: "Tshirt",
            size: "xl",
            color: "Blue"
        },
        {
            type: "Tshirt",
            size: "xl",
            color: "Black"
        }
    ]

我希望衬衫对象看起来像这样

     {
        _id: ObjectId('qwe098sdf786qwe098sdf786'),
        type: "Tshirt",
        size: "xl",
        color: "Black"
     }

我想我想要这样的东西(这里显示了一个要测试的人):

db.people.update( // query 
    {        
        $and : [
            _id: ObjectId('5eeb44c6a042791d28a8641f'),
            {
                $or: [
                { 'shirts._id': { $eq:null } },
                { 'shirts._id':{ $exists:false } }
                ]
            }           
        ]
    },{ // update 
        $set: { 'shirts._id': new ObjectId() }
    },{ // options
        "multi" : true
    }
);

但是这是我得到的:

Cannot create field '_id' in element

没有其他消息-没有错误,什么也没有发生...此特定记录的数组为3,其中2为“ _id:null”,第三个为ObjectId

尝试时:

$set: { 'shirts._id': new ObjectId() } try $set: { 'shirts.$[]._id': new ObjectId() }

它为每个数组元素生成IDENTICAL ObjectsID,但是我要在其上放置一个唯一的索引,但是用例可能不会看到数组中超过2-3个项目,边缘情况达到5-6,这似乎是一种滥用索引

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这是使用forEach的一种方法:

db.people.find({ ... }).forEach(function (doc) {
    doc.shirts.forEach(function (shirt) {
      if (shirt._id == null) {
        shirt._id = new ObjectId();
      }
    });
    db.people.save(doc);
  });