Meteor / Mongo嵌套数组更新

时间:2015-10-27 15:18:47

标签: mongodb meteor

我是meteor / mongo / js的新手,我正迷失在JSON数组中并引用它们。基于another SO answer(以及文档),我认为我很接近......

Orders集合中的文档,该文档具有嵌套数组。

Order -> orderLines -> lineItems:

示例文档:

{
"_id" : "27tGpRtMWYqPpFkDN",
"orderLines" : [
    {
        "lineId" : 1,
        "name" : "Cheese & Pickle",
        "instructions" : "",
        "lineItems" : [
            {
                "name" : "Cheddar Cheese",
                "quantity" : 1
            },
            {
                "name" : "Branston Pickle",
                "quantity" : 1
            },
            {
                "name" : "Focaccia Roll",
                "quantity" : 1
            }
        ]
    }
  ]
}

我想从meteor / mongo shell做什么:

  1. 将“foo”的“指令”添加到orderLines,其中lineId = 1
  2. 在lineItems数组上添加一个新项目
  3. 这似乎挂了......

    meteor:PRIMARY> db.orders.update({_id:"27tGpRtMWYqPpFkDN","orderLines.lineId":"1", {$set: {"orderLines.$.instructions":"foo"}})
    ... 
    

    这与查询

    中的标识符不同
    meteor:PRIMARY> db.orders.update({_id:"27tGpRtMWYqPpFkDN", "orderLines.lineId":"1"}, {$push:{"orderLines.$.lineItems":" { "name" : "butter", "quantity" : 1}"}});
    2015-10-27T16:09:54.489+0100 SyntaxError: Unexpected identifier
    

2 个答案:

答案 0 :(得分:0)

$push向数组添加新元素。您只是尝试在数组元素中设置特定键的值。

尝试:

db.orders.update({ _id: "27tGpRtMWYqPpFkDN", "orderLines.lineId": 1},
  { $set: { "orderlines.$.instructions": "foo" }})

docs

答案 1 :(得分:0)

感谢大家的评论...但我找到了一些答案,张贴供参考

第1项 - 对数组中的值使用$ set

由于在查询结尾处有两个拼写错误,一个丢失关闭},第二个在查询中为itemId引用了值“1”,这是失败的。

这有效:

 db.orders.update({_id:"27tGpRtMWYqPpFkDN", orderLines.lineId":1}, 
 {$set: {"orderLines.$.instructions":"foo"}})

我也意识到,当我说“它似乎挂起”时,cli正在等待一个有效的声明,因此提示缺少}或者)!

第2项 - 使用$ push将数据添加到数组 - 嵌套2个级别

由于引用了数组数据

,这是失败的
db.orders.update({_id:"27tGpRtMWYqPpFkDN", "orderLines.lineId":1 }, 
{$push:{"orderLines.$.lineItems": { "name" : "butter", "quantity" : 1} }})

嵌套数组:可以使用$ position运算符

我接下来要做的是在第二级数组中使用$ set,这需要使用$ position运算符两次:

db.orders.update({"orderLines.lineId":1, lineItems.name:"Cheddar Cheese"},
{$set: {"orderLines.$.lineItems.$.quantity": 2}})

这会引发错误:

Too many positional (i.e. '$') elements found in path

There is an open MongoDB enhancement request for this但它自2010年开始