如何在mongoose中查找和更新方法中的项目?

时间:2016-12-28 08:53:13

标签: node.js mongodb mongoose

我正在尝试更新一个对象数组,我需要找到一个提供日期的元素并更新其条目或者如果日期不存在则创建一个元素。

让我们说我有一个对象

{
    "_id" : ObjectId("586358f9e2ce6f42cfc024d7"),
    "gid" : "10",
    "entries" : [ 
        {
            "date" : 20161228,
            "_id" : ObjectId("586358f9e2ce6f42cfc024d8"),
            "entry" : [ 
                "fwaf", 
                "afwaaf", 
            ]
        }
    ],
    "__v" : 0
}

并且在此查询中,条目显示为undefined(由于mongoose调试选项而显示在控制台中)

Entry.findOneAndUpdate({'entries.date':20161228},{'entry':['inputis','a']},{upsert:true},function(err,data){
              if (err) console.error(err)
              console.log(data);
              return res.json(data)
            })

entries.entry也不起作用。我遵循了这个[Update nested array with Mongoose - MongoDB但是我认为我不可能使用子文档,我应该重构我的数据库,还是保留它,如果我这样做的话就没问题了。

如何在mongoose中引用找到的对象?这样我可以更新它的数组吗?

2 个答案:

答案 0 :(得分:0)

它将是 entries.entry

Entry.findOneAndUpdate({'entries.date':20161228},{'entries.entry':['inputis','a']},{upsert:true},function(err,data){
              if (err) console.error(err)
              console.log(data);
              return res.json(data)
            })

答案 1 :(得分:0)

您忘记指定数组元素索引。试试这个:

Entry.findOneAndUpdate({'entries.date':20161228},{$set: {"entries.0.entry":["inputis","a"]}},{upsert:true},function(err,data){
              if (err) console.error(err)
              console.log(data);
              return res.json(data)
            })

这将更新entries数组的第一个元素。要更新条目数组的所有元素,请使用

{$set: {"entries.$.entry":["inputis","a"]}}