我收藏了这样的文件:
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}
我有myArray
的新对象。我想编写一个查询来只更新一个文档。
如果查询与_id : "abcd"
的文档匹配,则将新对象推送到myArray
字段:
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
},
{
// new object
}
]
}
如果查询与_id : "efgh"
匹配,请在其中创建包含新对象的字段myArray
:
{
_id : "efgh",
name : "Jerry"
myArray : [
{
// new object
}
]
}
我怎样才能做到这一点?
答案 0 :(得分:19)
要解释所有可能的案例,请考虑每个案例:
如果要更改的文档如下所示:
{
"_id": "efgh",
"name": "Jerry"
}
然后是这样的更新声明:
db.collection.update(
{ "_id": "efgh" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } }
)
结果如下:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
因此创建了数组并附加了新项目。
如果您的文档已经有这样的数组:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
}
]
}
你基本上做了同样的陈述:
db.collection.update(
{ "_id": "abcd" },
{ "$push": { "myArray": { "field1": "abc", "field2": "def" } }
)
然后将新文档内容附加到现有数组:
{
"_id": "abcd",
"name": "Tom",
"myArray": [
{
"field1": "",
"field2": ""
},
{
"field1": "abc",
"field2": "def"
}
]
}
但是,如果您的原始文档具有命名字段,但它不是数组,如下所示:
{
"_id": "efgh",
"name": "Jerry",
"myArray": 123
}
然后通过在查询条件中进行测试并使用$set
来确保它不是数组:
db.collection.update(
{ "_id": "efgh", "myArray.0": { "$exists": false } },
{ "$set": { "myArray": [{ "field1": "abc", "field2": "def" }] }
)
这将安全地覆盖不是数组的元素(点符号" myArray.0"表示第一个数组元素,这不是真的),其中包含一个包含内容的新数组。结果与原始结果相同:
{
"_id": "efgh",
"name": "Jerry",
"myArray": [
{
"field1": "abc",
"field2": "def"
}
]
}
答案 1 :(得分:3)
$Push是您实现这一目标所需要的。 如果myArray已经存在,则$ push将向其插入newObject(类似于STACK数据结构操作)。 如果myArray不存在,它将创建字段“myArray”作为键,并将newObject插入其中(类似于$Set oprtaion)
考虑下面的另一个示例文档:
{
_id : "abcd"
myArray:[
{
field1:"mango",
field2:"apple"
}
]
}
所以现在让我们将下面的对象插入其中:
var newObject = {field1:"example1" , field2:"exmaple2"};
查询:
db.collection.update({_id:"abcd"},{"$push":{myArray: newObject }});
执行上述查询后,结果如下:
{
_id : "abcd"
myArray:[
{
field1:"mango",
field2:"apple"
},
{
field1:"example1" ,
field2:"exmaple2"
}
]
}
现在让我们考虑另一个例子,其中“myArray”键在文档中不存在:
{
_id:"efg"
}
所以让我们插入下面的对象:
var newObject2 = { field1 : "exp2" , field2 : "exp1" }
查询:
db.collection.update({_id:"efg"},{"$push":{myArray: newObject2 }});
上述UPDATE操作的结果如下:
{
_id : "efg"
myArray : [
{
field1 : "exp2" ,
field2 : "exp1"
}
]
}