如果数组存在,则将对象推入数组,否则在MongoDB中使用对象创建数组
我收集了这样一份文件:如果数组存在,则将对象推入数组,否则在MongoDB中使用对象创建数组,mongodb,mongodb-query,Mongodb,Mongodb Query,我收集了这样一份文件: { _id : "abcd", name : "Tom", myArray : [ { field1 : "", field2 : "" } ] }, { _id : "efgh", name : "Jerry" } 我为myArray创建了一个新对象。我想写一个只更新一个文档的查询 如果查询将文档与\u id:“abcd”匹配,则将新对象推入
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}
我为myArray
创建了一个新对象。我想写一个只更新一个文档的查询
如果查询将文档与\u id:“abcd”
匹配,则将新对象推入myArray
字段:
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
},
{
// new object
}
]
}
如果查询与\u id:“efgh”
匹配,则创建包含新对象的字段myArray
:
{
_id : "efgh",
name : "Jerry"
myArray : [
{
// new object
}
]
}
我如何才能做到这一点?是您实现这一点所需要的。
如果myArray已经存在,那么$push将向其插入新对象(类似于堆栈数据结构操作)。
如果myArray不存在,它将创建字段“myArray”作为键,并将新对象插入其中(类似于Optaion)
考虑下面的另一个示例文档:
{
_id : "abcd"
myArray:[
{
field1:"mango",
field2:"apple"
}
]
}
{
_id:"efg"
}
现在让我们将下面的对象插入其中:
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"
}
]
}
现在让我们考虑另一个例子,其中“MyRoad”键不存在于文档中:
{
_id : "abcd"
myArray:[
{
field1:"mango",
field2:"apple"
}
]
}
{
_id:"efg"
}
因此,让我们插入以下对象:
var newObject2 = { field1 : "exp2" , field2 : "exp1" }
查询:
db.collection.update({_id:"efg"},{"$push":{myArray: newObject2 }});
上述更新操作的结果如下:
{
_id : "efg"
myArray : [
{
field1 : "exp2" ,
field2 : "exp1"
}
]
}
这里解释所有可能的情况,考虑每个文档情况:
如果要更改的文档如下所示:{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}
{
“_id”:“efgh”,
“姓名”:“杰瑞”
}
然后是一个更新语句,如下所示:
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}
db.collection.update(
{u id:“efgh”},
{“$push”:{“myArray”:{“field1”:“abc”,“field2”:“def”}}
)
结果如下:
{
“_id”:“efgh”,
“姓名”:“杰瑞”,
“myArray”:[
{
“字段1”:“abc”,
“字段2”:“def”
}
]
}
因此,将创建数组并追加新项
如果您的文档已具有如下数组:
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}
{
“_id”:“abcd”,
“姓名”:“汤姆”,
“myArray”:[
{
“字段1”:“,
“字段2”:”
}
]
}
你基本上也是这么说的:
db.collection.update(
{u id:“abcd”},
{“$push”:{“myArray”:{“field1”:“abc”,“field2”:“def”}}
)
然后将新文档内容追加到现有数组中:
{
“_id”:“abcd”,
“姓名”:“汤姆”,
“myArray”:[
{
“字段1”:“,
“字段2”:”
},
{
“字段1”:“abc”,
“字段2”:“def”
}
]
}
但是,如果原始文档具有命名字段但不是数组,则如下所示:
{
_id : "abcd",
name : "Tom",
myArray : [
{
field1 : "",
field2 : ""
}
]
},
{
_id : "efgh",
name : "Jerry"
}
{
“_id”:“efgh”,
“姓名”:“杰瑞”,
“myArray”:123
}
然后,通过在查询条件中进行测试并使用以下命令来确保它不是数组:
db.collection.update(
{“_id”:“efgh”,“myArray.0”:{“$exists”:false},
{“$set”:{“myArray”:[{“field1”:“abc”,“field2”:“def”}}
)
这将使用包含内容的新数组安全地覆盖不是数组的元素(点符号“myArray.0”表示第一个数组元素,这不是真的)。结果与原始结果相同:
{
“_id”:“efgh”,
“姓名”:“杰瑞”,
“myArray”:[
{
“字段1”:“abc”,
“字段2”:“def”
}
]
}
您想做什么?是否将“efgh”中的“myArray”设置为与“abcd”相同的内容?还是要将新数组项同时推送到“abcd”和“efgh”?在您的问题上有一个链接,您可以在其中添加详细信息,以明确您的意图。@BlakesSeven,修改后的问题,希望您理解……仍然不清楚您在这里所说的“elseif”是什么意思。您是要更新“两个”文档,还是只选择更新其中一个文档?不,我不想同时更新这两个文档。一次只更新一个文档。你在这里试过什么吗?我猜这并不是因为你会看到当你把一个数组推送到一个不存在它的文档时,它只是创建了一个数组。如果存在现有数组,则追加新文档。因此,您可能根本没有尝试过,或者您的问题中仍然缺少一些关于您真正想要做什么的内容。您可以使用$push
而不是$addToSet
来检查数组是否包含完全相同的json文档?如果我们想要添加一个新文档本身,而不是使用该id的文档,该怎么办不可用?@Rahul_dabbi您找到问题的答案了吗?我希望能够做到这一点。