Javascript MongoDB-更新对象数组中的数组
我的结构如下:Javascript MongoDB-更新对象数组中的数组,javascript,node.js,mongodb,mongodb-query,database,Javascript,Node.js,Mongodb,Mongodb Query,Database,我的结构如下: { data: [ {pos:"0", moreData: ["a", "b"] }, {pos:"1", moreData: ["a", "c"] }, ]} 我想用一个更新来更新上面的结构。我想在moreData中添加一个字母,其中pos=1。这就是它最后的样子: { data: [ {pos:"0",
{
data: [
{pos:"0",
moreData: ["a", "b"]
},
{pos:"1",
moreData: ["a", "c"]
},
]}
我想用一个更新来更新上面的结构。我想在moreData中添加一个字母,其中pos=1。这就是它最后的样子:
{
data: [
{pos:"0",
moreData: ["a", "b"]
},
{pos:"1",
moreData: ["a", "c", "d"]
},
]}
我现在正在这样做:(使用猫鼬,但不管怎样都可以)
我得到的只是一个重复的“pos”:“1”和一个“moreData”,其中只包含新元素“d”。
任何帮助都将不胜感激。提前谢谢 您的数据结构有问题,
{“data.pos”:1}
选择整个文档(因此$push不能按预期工作):
尝试向文档中添加id或其他内容:
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "id" : "foo", "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] }
> db.demo.update({"id": "foo"}, {"$push": { "data" : { "pos": "2", "moreData": ["c", "d"]}}})
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] }, { "pos" : "2", "moreData" : [ "c", "d" ] } ], "id" : "foo" }
似乎做了您想做的。这里的问题是您需要推送到正确的数组元素。可以通过点符号和索引值直接执行此操作,也可以使用运算符:
model.update(
{“data.pos”:“1”},
{“$push”:{“data.$.moreData”:“d”},
功能(错误,未受影响){
})
它应该与“数据”数组的选定索引匹配,以便执行更新。不过要注意,您有嵌套数组,无法匹配和更新内部数组中的项。有关此信息,请参阅位置操作员文档,感谢您的快速回复。正如您在解决方案中所建议的,您正在向第一级阵列添加一个新的“pos”。我想添加的是一个新数据到现有“pos”的“moreData”数组中。检查Neil的解决方案是否有效。mongoDB中的嵌套数组可能会很混乱(我想是否有办法解决它!)感谢您的快速回复!我已经尝试过你的解决方案,但它没有给数据库添加任何内容。我认为,正如您已经提到的,您不能将$用于嵌套数组。@user881387您的实际数据与问题不同吗?这确实适用于您提供的数据。可以将$用于嵌套数组,但它只匹配第一个元素,这就是本例所需的全部内容。只有当您想将“moreData”中的“c”元素更改为“b”时,才会出现问题。这里不能匹配两个数组索引。但是像上面这样的$push操作没有什么错。@user881387不是最好的方法,因为它很难阅读。但你似乎问了一些与你的问题不同的问题。你的问题已经给出了答案,如果你还有其他问题,那么再发一个。给定的语句将在给定的条件下将“d”元素添加到数组中。My bad。。。。我实际上是在做{“$push”:{“data.$.pos”:“d”}它能用!!!:)
> db.demo.find({"data.pos": "1"})
{ "_id" : ObjectId("533a850fd15748cc2dc1a17f"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] }
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "id" : "foo", "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] }
> db.demo.update({"id": "foo"}, {"$push": { "data" : { "pos": "2", "moreData": ["c", "d"]}}})
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] }, { "pos" : "2", "moreData" : [ "c", "d" ] } ], "id" : "foo" }