addToSet mongodb无法正常工作

时间:2014-08-08 10:28:28

标签: mongodb mongodb-query

当前文件

{
    "_id" : ObjectId("53d9c7654dfe220f0e8b45bb"),
    "cd" : 1406781202,
    "op" : [
    {
        "fr" : "test test"
    }
],
}

我想更新“op”,仅举例如下:

{
    "_id" : ObjectId("53d9c7654dfe220f0e8b45bb"),
    "cd" : 1406781202,
    "op" : [
    {
        "fr" : "test test"
    },
    {
        "hi" : "test 123",          
    },
    {
        "mp" : "test abc",          
    }
],
}

在上面的示例中,“fr”索引在更新之前存在,我添加了“hi”。

请让我知道查询?

这是实现这一目标的理想方式吗?即我使用索引fr,hi等将数据保存在“op”中,所以这个字段应该只是这样吗?

2 个答案:

答案 0 :(得分:4)

我通常得到的是你似乎正在使用"值作为键"这是一种你不应该遵循的反模式。原来的帖子甚至没有显示阵列,但结构仍然没有好多了。

你应该有这样的东西:

{
    "_id" : ObjectId("53d9c7654dfe220f0e8b45bb"),
    "cd" : 1406781202,
    "op" : [
        {
            "key": "fr", "value": "test test"
        }
    ],
}

然后您可以按如下方式将元素推送到数组中:

db.collection.update(
    { "_id": ObjectId("53d9c7654dfe220f0e8b45bb") },
    {
        "$push": { 
            "op": { 
                "$each": [ 
                    { "key": "hi", "value": "test 123" },
                    { "key": "mp", "value": "test abc" }
                ]
            }
        }    
    }
)

通过这种方式,您只能为所有选项的集合创建一个索引。

db.collection.ensureIndex({ "op.key": 1 })

你也可以这样查询:

db.collection.find({ "op.key": "fr" })

而不是使用不能使用索引的运算符,例如 $exists

db.collection.find({ "op.fr": { "$exists": true } })

目前您将会遇到这种情况。

答案 1 :(得分:0)

db.collection.update({“_ id”:ObjectId(“53d9c7654dfe220f0e8b45bb”)},{$ set:{“op.hi”:“test 45”}})