MongoDB - 更新对象数组中的数组
MongoDB - update arrays in object array
我有以下结构:
{
data: [
{pos:"0",
moreData: ["a", "b"]
},
{pos:"1",
moreData: ["a", "c"]
},
]}
我想通过更新来更新上述结构。我想在更多数据中添加一个字母,其中 pos=1。这是它最后的样子:
{
data: [
{pos:"0",
moreData: ["a", "b"]
},
{pos:"1",
moreData: ["a", "c", "d"]
},
]}
我现在正在这样做:(使用猫鼬,但无论如何都没问题)
model.update({"data.pos":"1"},
{ $push: {data:{ pos:"1", moreData:["d"] } } },
{ safe: true, upsert: false }, function(err){
});
我得到的只是一个重复的"pos":"1",其中"moreData"只包含新元素"d"。任何帮助将不胜感激。提前感谢!
这里的问题是您需要推送到正确的数组元素。您可以直接通过点表示法和索引值或使用位置$
运算符执行此操作:
model.update(
{"data.pos": "1" },
{ "$push": { "data.$.moreData": "d" } },
function(err, numAffected) {
})
这应该与"data"数组的选定索引匹配,以便执行更新。但请注意,您有嵌套数组,您将无法匹配和更新内部数组中的项目。请参阅位置操作员文档
您的数据结构有问题,{"data.pos": 1}
选择了整个文档(因此$push没有按预期运行):
> db.demo.find({"data.pos": "1"})
{ "_id" : ObjectId("533a850fd15748cc2dc1a17f"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] }
尝试在文档中添加 ID 或其他内容:
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "id" : "foo", "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] } ] }
> db.demo.update({"id": "foo"}, {"$push": { "data" : { "pos": "2", "moreData": ["c", "d"]}}})
> db.demo.find({"id": "foo"})
{ "_id" : ObjectId("533a85c9d15748cc2dc1a180"), "data" : [ { "pos" : "0", "moreData" : [ "a", "b" ] }, { "pos" : "1", "moreData" : [ "a", "c" ] }, { "pos" : "2", "moreData" : [ "c", "d" ] } ], "id" : "foo" }
似乎做你想做的事。
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象