Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点+;Mongodb$拉不动?_Node.js_Mongodb - Fatal编程技术网

Node.js 节点+;Mongodb$拉不动?

Node.js 节点+;Mongodb$拉不动?,node.js,mongodb,Node.js,Mongodb,我正在使用Node.js和MongoDB,并尝试设置删除路由。在负责处理删除的函数中,我使用Mongo的“$pull”操作符。我现在看了几个例子,我不知道我做错了什么 下面是如何设置数据库文档的示例 { "_id": { "$oid": "123abc" }, "sleepData": [ { "date": "03/28/2016", "hour": "11", "minute": "11", "meridiem"

我正在使用Node.js和MongoDB,并尝试设置删除路由。在负责处理删除的函数中,我使用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(“删除请求查询:\n”,sleepDataToDelete)所描述的内容;打印输出,这也匹配sleepData数组中的第三个索引

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

我甚至尝试过将json字段名放在双引号/单引号中,但这也不起作用。修改的对象数为0。我还尝试将“$pull{…}”查询简化为“date”,而不是“date”、“hour”、“minute”、“meridiem”和“feeling”。这仍然会导致print语句中的0个修改项。

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

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