Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB-更新对象数组中的数组_Javascript_Node.js_Mongodb_Mongodb Query_Database - Fatal编程技术网

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" }