我有一个像这样的mongo文档.
{
"_id" : ObjectId("50b429ba0e27b508d854483e"),
"array" : [
{
"id" : "1",
"letter" : "a"
},
{
"id" : "2",
"letter" : "b"
}
],
"tester" : "tom"
}
Run Code Online (Sandbox Code Playgroud)
我希望能够array使用单个mongo命令插入和更新,而不是在find()当时运行中使用条件insert(),update()具体取决于对象的存在.
这id是我想成为选择器的项目.所以如果我用这个更新数组:
{
"id" : "2",
"letter" : "c"
}
Run Code Online (Sandbox Code Playgroud)
我必须使用一个$set声明
db.soup.update({
"tester":"tom",
'array.id': '2'
}, {
$set: {
'array.$.letter': 'c'
}
})
Run Code Online (Sandbox Code Playgroud)
如果我想在数组中插入一个新对象
{
"id" : "3",
"letter" : "d"
}
Run Code Online (Sandbox Code Playgroud)
我必须使用一个$push声明
db.soup.update({
"tester":"tom"
}, { …Run Code Online (Sandbox Code Playgroud) 我有一个集合,哪些元素可以简化为:
{tags : [1, 5, 8]}
数组中至少有一个元素,所有元素都应该不同.我想用一个标签替换另一个标签,我认为不会有问题.所以我想出了以下查询:
db.colll.update({
tags : 1
},{
$pull: { tags: 1 },
$addToSet: { tags: 2 }
}, {
multi: true
})
Run Code Online (Sandbox Code Playgroud)
很酷,所以它会找到所有带有我不需要的标签的元素(1),删除它并添加另一个(2)如果它不存在.问题是我收到一个错误:
"无法同时更新'标签'和'标签'"
这基本上意味着我不能同时做pull和addtoset.有没有其他方法可以做到这一点?
当然,我可以记住元素的所有ID,然后删除标记并添加单独的查询,但这听起来不太好.
我有一个带有数组字段的文档,类似于:
{
"_id" : "....",
"Statuses" : [
{ "Type" : 1, "Timestamp" : ISODate(...) },
{ "Type" : 2, "Timestamp" : ISODate(...) },
//Etc. etc.
]
}
Run Code Online (Sandbox Code Playgroud)
如何通过指定其类型值来更新特定状态项的时间戳?
想要在文档数组中的对象属性中进行插入
考虑收集m中的文档
{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x" : [
{ "id":0.0, "name":"aaa"},{ "id":1.0, "name":"bbb"}
]
}
Run Code Online (Sandbox Code Playgroud)
要添加age:100到{ "id":0.0, "name":"aaa"}.不仅仅是年龄..但是在数组元素{}中提供upsert.所以它可以包含{age:100,"city":"amd"}(因为我从应用程序服务获得这个)
正在尝试这个...但没有工作,因为它取代了整个数组元素
db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x" : {
"$elemMatch" : {
"id" : 0.0
}
}},
{
$set : {
"x.$" : {
"age": 100
}
}
},
{upsert: true}
)
Run Code Online (Sandbox Code Playgroud)
将文档更改为(我不想要的)
{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"),
"x" : [
{ "age":100},{ "id":1.0, "name":"bbb"}
]
}
Run Code Online (Sandbox Code Playgroud)
如果不改变架构,这是否可行.