【问题标题】:Mongodb find is not working with the ObjectidMongodb find 不适用于 Objectid
【发布时间】:2015-02-26 00:57:13
【问题描述】:

这是我的代码,我得到了文档的空值。但是在 findOne({'webpageid':docs[i]._id} 而不是 docs[i]._id 中,如果我传递了 pagesid 它可以工作。并且我验证了 docs 具有所需的网页数据

// get all the records from the webpages table
var collection = db.get('webpages');
collection.find({}, function(e,docs){
	// iterate over the webpage list
	for (var i = 0; i < docs.length; i++) {
		// check if results table has any record for this webpage
		db.get('results').findOne({'webpageid':docs[i]._id}, function(err, doc)
		{
			if(err)
			{
				return;
			}
			console.log(doc);
		});
	};
});

以下是“网页”表中的内容

{
        "_id" : ObjectId("549608e16ecb16dc3c4880e6"),
        "name" : null,
        "url" : "http://www.google.com",
        "texttoverify" : null,
        "interval" : null,
        "websiteid" : null
}
{
        "_id" : ObjectId("549609986ecb16dc3c4880e7"),
        "name" : null,
        "url" : "http://www.google.com",
        "texttoverify" : null,
        "interval" : null,
        "websiteid" : null
}
{
        "_id" : ObjectId("54960a916ecb16dc3c4880e8"),
        "name" : "xyz",
        "url" : "http://www.google.com",
        "texttoverify" : "hello",
        "interval" : "00:15:00.0000000",
        "websiteid" : "02D7BE81-4E01-4347-BAE5-BA9A2D7EE11E"
}

这是我在“结果”表中的内容

{
        "_id" : ObjectId("54985a1e69af082f9c477574"),
        "webpageid" : "549608e16ecb16dc3c4880e6"
}
{ "_id" : ObjectId("54986f4e69af082f9c477575"), "name" : "name" }
{
        "_id" : ObjectId("5498d10c69af082f9c477576"),
        "name" : "name",
        "webpageid" : "\"54960a916ecb16dc3c4880e8"
}
{
        "_id" : ObjectId("5498d1f969af082f9c477577"),
        "name" : "name",
        "webpageid" : "54960a916ecb16dc3c4880e8"
}

感谢您的调查并感谢您的帮助。

【问题讨论】:

  • 您需要提取ObjectId的HexaDecimal String值,然后使用它来查询结果集合。 - stackoverflow.com/questions/13104690/…,因为 results 集合有 webpageid 作为字符串,而不是 ObjectId

标签: javascript node.js mongodb


【解决方案1】:

您的网页 ID 是字符串,而您搜索的 _id 是 ObjectId。您的查找与任何结果都不匹配,因为结果表中没有包含“webpageid”元素的 ObjectId 值的文档。

我认为有两种解决方案。

  1. 您可以在 results 集合中存储 webpageid 元素的 ObjectIds 而不是字符串。当然,这取决于这些文档如何进入集合。
  2. 您可以从循环中返回的ObjectId 创建一个字符串变量来进行比较。例如,

    ...
    for(var i = 0; i < docs.length; i++) {
        var docId = docs[i]._id.toString(); // create a string
        db.get('results').findOne({'webpageid':docId}, function(err, doc)
        ...
    

如果您选择第二个选项,您可能需要查看为什么在 webpageid 集合中的第二个文档的 webpageid 值的开头有一个前导引号。

"webpageid" : "\"54960a916ecb16dc3c4880e8"

最后,我不太了解您的要求,但您可能想重新考虑将 MongoDB 作为一种解决方案。看来您正在创建类似 JOIN 的东西,而 MongoDB 的设计并不能很好地处理。

【讨论】:

  • 您能否在答案中包含 OP 需要做什么才能完成这项工作。这将完成这个答案。
  • 感谢您的帮助。真的很感激。我认为问题在于objectid vs string。这是(dropbox.com/s/1r0fkafs8l48b6t/mongodb.txt?dl=0)我尝试过但仍然为空的。我正在使用 mongojs 作为驱动程序github.com/mafintosh/mongojs
  • @NoOutlet:我们可以忽略前导引用记录(“webpageid”:“\”54960a916ecb16dc3c4880e8”)。我错误地添加了。
  • Wooho.. 非常感谢大家。我在您的代码中做了一个小编辑 - 用 toString() 替换了“str”。如果有人感兴趣,这是我的最终代码dropbox.com/s/wq9cyqblxg66w6b/mongodb_final.txt?dl=0
  • 在shell中你也可以使用:_id.valueOf()函数。
猜你喜欢
  • 2017-08-03
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多