在没有信誉的情况下更新mongodb中的嵌套数组元素

时间:2017-11-22 10:01:50

标签: arrays node.js mongodb

我的名为' test'因为有一个文件,如:

{
"_id" : 1
"letters" : [ 
        [ "A", "B" ], 
        [ "C", "D" ], 
        [ "A", "E", "B", "F" ]
    ]
}

如果我使用这样的$ addToSet更新文档:

db.getCollection('test').update({"_id" : 1}, {$addToSet:{"letters": ["A", "B"] }})

它不会插入另一个值。文件仍然是

{
"_id" : 1
"letters" : [ 
        [ "A", "B" ], 
        [ "C", "D" ], 
        [ "A", "E", "B", "F" ]
    ]
}

如果我像这样更新:

db.getCollection('test').update({"_id" : 1}, {$addToSet:{"letters": ["B", "A"] }})

现在它将更新文档,如:

{
"_id" : 1
"letters" : [ 
        [ "A", "B" ], 
        [ "C", "D" ], 
        [ "A", "E", "B", "F" ],
        [ "B", "A" ]
    ]
}

我的要求是如果我也这样给([" B"," A"]),它将不会更新该文件。因为数组中已存在相同的字母。

任何人都可以请求解决方案。

2 个答案:

答案 0 :(得分:0)

尝试这个答案,它有效。

使用$ push在您的案例中插入数组中的任何项目。

db.getCollection('stack').update(
       { _id: 1 },
       { $push: { "letters": ["B", "A"] } }
    )

有关$ push的参考,您可以查看此链接 -

https://docs.mongodb.com/manual/reference/operator/update/push/

答案 1 :(得分:0)

@Shubham有正确的答案。您应该始终在保存到文档之前将字母排序。所以原始文档应该是(我更改了第三个数组):

{
  "_id" : 1,
  "letters" : [ 
        [ "A", "B" ], 
        [ "C", "D" ], 
        [ "A", "B", "C", "F" ]
    ]
}

然后在您的应用程序中进行排序。我在这里包含一个Mongo Shell示例。

var input = ["B", "A"];
input.sort();
db.getCollection('test').update({"_id" : 1}, {$addToSet:{"letters":  input}});