如何在MongoDB中返回文档的ObjectId或_id?和错误“$ in需要一个数组”

时间:2014-07-03 15:19:17

标签: mongodb objectid nosql

我在MongoDB中有一个文档,我想获得本文档的ObjectId,但到目前为止我还没有找到一个对我这样做的方法。

查询示例:

 user= db.users.find({userName:"Andressa"})

这会返回:

 { "_id" : ObjectId("53b1c579bdf3de74f76bdac9"), "userid" : 0, "userName" : "Andressa", "userEmail" : "dessa_beca@hotmail.com", "teams" : [ 1, 2, 3 ] }

我想让ObjectId做另一个查询。

示例:

 userID =  `user._id();` //but this does not work, of course, its an example

因此,我可以使用ObjectId来执行另一个查询:

 userFind = db.users.find({_id: userID})

更新:       这段代码:

 db.teams.find({_id:{$in: user.teams}})

返回此错误:

error: {
    "$err" : "Can't canonicalize query: BadValue $in needs an array",
    "code" : 17287

有人知道吗?

6 个答案:

答案 0 :(得分:5)

在mongo shell中,您可以使用它来检索_id

user._id.str

user._id.toString()

请参阅文档:http://docs.mongodb.org/manual/reference/method/ObjectId.valueOf/

答案 1 :(得分:3)

我明白了!实际上,我可以通过这段代码来实现:

而不仅仅是:

user = db.users.findOne({userName:"And"})

我做了:

  var user = db.users.findOne({userName:"And"})

  user._id 

返回ObjectId(“someId”) ,如果我想把它保存在我做的某个变量中:

var Id = user._id. 

关于第二个问题,我不知道。

答案 2 :(得分:2)

我遇到了我认为同样的问题 - 如何从未知的mongo文档中检索ObjectId。我已经构建了一个通用的datacontext,并且在我的更新和删除方法中需要_id。在寻找如何做到这一点的答案时找到了你的问题后,我决定发布最终为我工作的内容。

private BsonValue GetId<TEntity>(TEntity entity)
{
    var bsonDoc = entity.ToBsonDocument();
    return bsonDoc.GetElement("_id").Value;
}

然后我使用它:

 var id = GetId<TEntity>(entity);
 var filter = builder.Eq("_id", id);
 var doc = collection.Find(filter).SingleOrDefault();

希望这有帮助。

答案 3 :(得分:0)

您可以使用find()方法来实现此目的。

db.collection.find()方法不返回实际文档,但它将游标返回给文档。通过遍历光标,您将获得该文档中的字段。

代码:

    var cursor=db.collection.find()

    var objectId= cursor.next()._id

上面的语句从当前游标实例获取ObjectId的值。 如果要检索所有objectId,那么通过迭代游标,您将获得ObjectId的所有值。

要使用第一步中收到的objectId直接查找文档,您可以使用以下代码段:

       db.collection.find( { "_id": objectId},{ fields Of Your Choice } )

答案 4 :(得分:0)

尝试一下(对于Node v12.16.3 / MongoDB MongoDB v4.2.6)

// find if a value exists
collection.find({ "criteria1": value1, "criteria2": value2 }).toArray
(function(err, doc) {

    if (err) {
        console.log('Error, Please Try Again');
    }
    else if (doc.length === 0) {
        console.log('Does Not Exist');
    } else {
        console.log(doc);
        console.log(doc[0]._id)
    }
});

答案 5 :(得分:0)

使用MongoDB Node.js驱动器并进行ES6解构

const { _id } = db.collection("users").findOne({ userName:"Andressa" })

甚至更好,在重组时重命名...

const { _id: userId } = db.collection("users").findOne({ userName:"Andressa" })

然后可以根据需要在代码中使用userId ...