如何在mongoshell

时间:2016-03-07 14:29:26

标签: node.js mongodb mongoose database nosql

我有一个架构:

{
    "id": String,
    "username": String,
    "password": String,
    "email": String,
    "firstName": String,
    "lastName": String,

    "system" : {
            "item" : {type: Number},
            "update_interval" :  { type: Number, max: 99999 },
            "reading" : [
                {
                    "id" :              { type: Number},
                    "adc1"  :           { type: Number, max: 4095 },
                    "adc2"  :           { type: Number, max: 4095 },
                    "pc_datestamp" :Date,
                }
            ]
    }

现在我想将值添加到

"reading" : [
                    {
                        "id" :              { type: Number},
                        "adc1"  :           { type: Number, max: 4095 },
                        "adc2"  :           { type: Number, max: 4095 },
                        "pc_datestamp" :Date,
                    }
                ]

但我不知道我错在哪里我试图从mongoshell更新数据但直到现在都没有成功

> db.users.update( {"email" : "test@test.com", "system.item": 1,   }, {"$push": {"system.$.reading": [{"adc1" : "123", "adc2": "1245", "id":"1" }] } })
WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16837,
        "errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: system.$.reading"
    }

> db.users.update( {"email" : "test@test.com", "system": {$elemMatch:{ item: 1}}   }, {"$push": {"system.$.reading": {"adc1" : "123", "adc2": "1245", "id":"1" } } })
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

我已将item的值设置为一个

> db.users.find( {"email" : "test@test.com", "system.item": 1}   ).pretty()
{
    "_id" : ObjectId("56dd88578ff7fbd714091a4a"),
    "lastName" : "test",
    "firstName" : "test",
    "email" : "test@test.com",
    "password" : "$2a$10$wY9wr9oreza4fBX7CfXym.rPZUPrcesigYIfWd0zbM4dDjBy6k3vy",
    "username" : "test",
    "system" : {
        "item" : 1,
        "reading" : [ ]
    },
    "__v" : 0
}

我已经关注

Mongodb $push in nested array

这个 Insert data in nested array in mongodb

还有更多问题,但找不到什么错误。

1 个答案:

答案 0 :(得分:0)

由于位置 $ 运算符充当与查询文档匹配的第一个元素的占位符,并且array字段必须作为查询文档的一部分出现,你的更新 操作不满足这些条件,因此它会受到你得到的错误命运的影响。在您的查询中,您只引用不是数组的"system.item"字段。

您可以做的另一个选择是放弃更新中的位置 $ 运算符,只需使用 $addToset 将对象添加到数组中只有在数组中尚不存在元素时才会将元素添加到数组中:

db.users.update(
    {
        "email": "test@test.com", 
        "system.item": 1
    }, 
    {
        "$addToSet": {
            "system.reading": {
                "adc1" : "123", 
                "adc2": "1245", 
                "id":"1" 
            }
        } 
    }
)