我有一个集合,该集合的字段是对象数组... 我想为每个对象添加一个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,这似乎是一种滥用索引
有什么建议吗?
答案 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);
});