直接在MongoDB中引用ObjectID,但不在Mongoose中

时间:2015-04-10 18:42:38

标签: javascript node.js mongodb mongoose

第一个代码段实现了预期的效果:

//in mongodb console:
db.collection.update({"username":"name"}, {$pull : { "task" : { "_id" : ObjectId("55280205702c316b6d79c89c")}}})

然而,用Mongoose编写的第二个(看似等效的)代码片段不是:

//in Mongoose:
var taskID = "55280205702c316b6d79c88c"
var pull = { $pull : {}};
var idObj = {};
idObj["_id"] = taskID;
pull.$pull["task"] = idObj;

collectionModel.update({"username": "name"}, pull) //fails to work since taskID just shows up as a literal string 55280205702c316b6d79c88c instead of ObjectId("55280205702c316b6d79c88c")

我尝试过的其他事情:

  • 使var taskID等于字符串'ObjectId(\"55280205702c316b6d79c88c\")'
  • var taskID设置为mongoose.Types.ObjectId("55280205702c316b6d79c88c")

如何在Mongoose的前代码片段中实现效果?

2 个答案:

答案 0 :(得分:1)

导入ObjectId类型并在查询中使用它:

var ObjectId = require('mongoose').Types.ObjectId; 
idObj["_id"] = new ObjectId("55280205702c316b6d79c88c");

答案 1 :(得分:0)

在mongodb shell中执行了 $pull 操作并尝试使用相同的ObjectId在Mongoose中进行相同的更新操作后,它没有工作,因为任务数组对象元素与先前的mongodb shell操作删除了"_id": ObjectId("55280205702c316b6d79c88c")

首先尝试从Mongoose运行相同的查询,但是使用不同的现有taskID并将其强制转换为ObjectId。您可以按如下方式向String对象添加扩展名:

String.prototype.toObjectId = function() {
    var ObjectId = (require("mongoose").Types.ObjectId);
    return new ObjectId(this.toString());
};

var taskID = "55280205702c316b6d79c88d".toObjectId(); // a different _id
collectionModel.update( 
    { "username": "name" }, 
    { "$pull" : { "task": { "_id": taskID } } }, 
    function (err, result) {
        console.log(result);        
    }
);