问题
I have a document in mongodb collection like this:
{
_id: 133,
Name: "abc",
Price: 20
}
I would like to add a new field "PackSizes" which may be or not may be of an array type, and then would like to an embedded document in it. Like-
PackSizes:
[
{_id: 123, PackSizeName:"xyz", UnitName:"pqr"}
]
or,
PackSizes: {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}
I'm a newcomer to mongodb. Please help.
回答1:
You can do it with
db.test.update(
{ _id : 133 },
{ $set : { PackSizes: {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}} }
)
PackSizes could be any document, with array or without it.
Your result document will be
{
"_id" : 133,
"Name" : "abc",
"Price" : 20,
"PackSizes" : {
"_id" : 123,
"PackSizeName" : "xyz",
"UnitName" : "pqr"
}
}
Updated: For add new field and a member to array,
Assume we have your original document
{
_id: 133,
Name: "abc",
Price: 20
}
Step 1 : add new field: PackSizes is an array
db.test.update(
{ _id : 133 },
{ $set : {PackSizes: [ {_id: 123, PackSizeName:"xyz", UnitName:"pqr"}]}}
)
Step 2: push new item to array
db.test.update(
{ _id : 133 },
{ $push : { PackSizes: {_id: 124, PackSizeName:"xyz", UnitName:"pqr"}} }
)
and you will have
{
"_id" : 133,
"Name" : "abc",
"Price" : 20,
"PackSizes" : [
{
"_id" : 123,
"PackSizeName" : "xyz",
"UnitName" : "pqr"
},
{
"_id" : 124,
"PackSizeName" : "xyz",
"UnitName" : "pqr"
}
]
}
回答2:
In your Json structure _id is mongoDB immutable field so in your case if you changed _id to simply id and _id represents mongo id then following javascript may solve your problem
db.test.find().forEach(
function(doc){
db.upsert.update({},{"$unset:{"id":1,"Name":1,"Price":1}},false,true);
db.upsert.update({},{"$set":{"PackSizes":doc}},true,false)}
)
If you achieve your output as given by you then first you should unset your documents and then set update
来源:https://stackoverflow.com/questions/26967525/insert-an-embedded-document-to-a-new-field-in-mongodb-document