【问题标题】:Node + Mongodb. $pull not working?节点+MongoDB。 $pull 不工作?
【发布时间】:2016-03-31 14:02:49
【问题描述】:

我正在使用 Node.js 和 MongoDB,并且正在尝试设置 DELETE 路由。在负责处理删除的函数中,我使用的是 Mongo 的“$pull”运算符。我现在看了几个例子,我不知道我做错了什么。

这是如何设置数据库文档的示例

{
"_id": {
    "$oid": "123abc"
},
"sleepData": [
    {
        "date": "03/28/2016",
        "hour": "11",
        "minute": "11",
        "meridiem": "PM",
        "feeling": "7"
    },
    {
        "date": "03/29/2016",
        "hour": "3",
        "minute": "41",
        "meridiem": "PM",
        "feeling": "1"
    },
    {
        "date": "03/30/2016",
        "hour": "1",
        "minute": "29",
        "meridiem": "AM",
        "feeling": "5"
    },
    {
        "date": "03/30/2016",
        "hour": "1",
        "minute": "38",
        "meridiem": "AM",
        "feeling": "4"
    },
  ]
}

*注意几乎重复的数据,这就是我的 $pull 查询如此具体的原因。

这是我的路线功能

module.exports.DELETE = function(req, res) {
var sleepDataToDelete = {
    date: req.query.date,
    hour: req.query.hour,
    minute: req.query.minute,
    meridiem: req.query.meridiem,
    feeling: req.query.feeling
};

// next code block is what this console prints out
console.log("Deleting req.query:\n", sleepDataToDelete);

var sleepObjectId = req.query.sleepObjectId;
var sleepDataCollection = db.get().collection('sleepData');
sleepDataCollection.update(
    {
        _id: sleepObjectId
    },
    {
        $pull: {
            sleepData: {
                date: sleepDataToDelete.date,
                hour: sleepDataToDelete.hour,
                minute: sleepDataToDelete.minute,
                meridiem: sleepDataToDelete.meridiem,
                feeling: sleepDataToDelete.feeling
            }
        }
    },
    function(err, result) {
        if(err) {
            console.log("err", err);
            return res.status(400).end();
        } else {
            console.log("Count: ", result.result.n);
            console.log("Deleted! :) ");
            return res.status(200).end();
        }
    }
);

};

这就是 console.log("Deleting req.query:\n", sleepDataToDelete);打印出来,它也匹配 sleepData 数组中的第三个索引。

Deleting req.query:
{ 
  date: '03/30/2016',
  hour: '1',
  minute: '29',
  meridiem: 'AM',
  feeling: '5'
}

我什至尝试将 json 字段名称放在双引号/单引号中,但这也不起作用。修改的对象数为 0。我还尝试将“$pull {...}”查询减少为仅“日期”而不是“日期”、“小时”、“分钟”、“meridiem”和“感觉。”这仍然会导致 print 语句中的 0 个修改项。

【问题讨论】:

  • $pull 的实际参数中的某些内容实际上与内容不匹配。请注意,您不需要所有属性,而只需要标识要删除的数组元素所需的属性,即{ "date": "03/29/2016", "hour": "11" },如果没有其他元素带有"hour": "11$pull$elemMatch 类似,其中包含的参数是“查询”。还要检查sleepObjecId实际上是ObjectId,好像nMatched实际上是0那么你基本上不匹配文档。
  • @BlakesSeven 我尝试匹配所有字段的原因是因为可能有其他对象仅相差几分钟或几小时。我继续检查了 sleepObjectId,它是正确的。真正让我困惑的是,为了让我调用我的删除功能,我首先运行一个基于日期的搜索功能。如果搜索函数返回数据,那么此时我可以删除数组中的特定对象。
  • 您应该从评论中删除的是“检查您的价值观”。如果您仍然无法基于此进行计算,那么您需要在您的问题中包含正在使用的变量的值。我们看到的只是变量名本身。问题在于“内容”。
  • 啊,好吧好吧,那么让我编辑我的帖子。
  • 我告诉过你_id 是一个“字符串”。更改此var sleepObjectId = new mongodb.ObjectId(req.query.sleepObjectId);。下一次console.log(result),您将看到明显的nMatched0,因为您从未匹配过文档。

标签: node.js mongodb


【解决方案1】:

正如@BlakesSeven 所指出的,我没有在查询中传入 ObjectId。所以,功劳归于他。不用说,这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 2012-06-09
    • 2018-05-06
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多