Node.js 节点+;Mongodb$拉不动?
我正在使用Node.js和MongoDB,并尝试设置删除路由。在负责处理删除的函数中,我使用Mongo的“$pull”操作符。我现在看了几个例子,我不知道我做错了什么 下面是如何设置数据库文档的示例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"
{
"_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
,因为您从未匹配过文档。