addToSet mongodb不工作

addToSet mongodb不工作,mongodb,mongodb-query,Mongodb,Mongodb Query,当前文件 { "_id" : ObjectId("53d9c7654dfe220f0e8b45bb"), "cd" : 1406781202, "op" : [ { "fr" : "test test" } ], } 我只想更新op,如下例所示: { "_id" : ObjectId("53d9c7654dfe220f0e8b45bb"), "cd" : 1406781202, "op" : [ {

当前文件

{
    "_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

请让我知道这个问题


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

db.collection.update{{u id:ObjectId53d9c7654dfe220f0e8b45bb},{$set:{op.hi:test 45}}

我通常的意思是,您似乎在使用值作为键,这是一种不应该遵循的反模式。原来的帖子甚至没有显示数组,但结构仍然没有太好

你应该有这样的东西:

{ _id:Objectd53D9C7654DFE220F0E8B45BB, cd:1406781202, 作品:[ { 键:fr,值:测试 } ], } 然后可以按如下方式将元素推入数组:

db.collection.update {u id:ObjectId53d9c7654dfe220f0e8b45bb}, { $push:{ op:{ 每元:[ {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}
这就是您当前需要解决的问题。

提供的答案没有解释的是,这不是数组类型$addToSet用于数组,这是您真正应该使用的。使用值作为键是个坏消息。是的,我想使用op作为数组类型,但在这种情况下,我无法更新fr或hi,因为在这种情况下,我必须使用Push和pull…如果我错了,请告诉我op字段当前不是数组。你真的在问如何把它变成一个数组吗?我可以把它做成一个数组…但在这种情况下,我将如何更新fr或hi字段???因为在这种情况下,我必须使用推拉…所以请建议我解决方案…op可以有多个索引,我也想更新它们。@NeilLunn请评论?