如何在 Node.js 中通过 Mongoose 使用 dot(.) 进行查询以及如何添加空数组
Posted
技术标签:
【中文标题】如何在 Node.js 中通过 Mongoose 使用 dot(.) 进行查询以及如何添加空数组【英文标题】:How to do a query using dot( . ) through Mongoose in Node.js and How to add an empty array 【发布时间】:2014-09-04 20:31:29 【问题描述】:我有以下架构:
var userSchema = new Schema(
userID: Number,
userName: String,
userEmail: String,
teams:Array,
socialMedias:
fbUID: String,
googleUID: String,
twitter: String
);
首先,如何添加一个空数组?我在下面的做法是否正确?
teams:,
其次,我尝试在我的 Node.js 中使用 Mongoose 进行查询,但在点 ('.') 中出现错误:
这是我正在保存的文档:
var user = new users(
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:,
socialMedias: [socialMediaType: socialMediaID]
);
其中 userName、socialMediaType 和 socialMediaID 是函数的参数。
因此,在添加此文档后,我正在尝试执行以下查询:
function searchUser(socialMediaID, socialMediaType)
var user
users.findOne(socialMedias.socialMediaType: socialMediaID, function(err, userFound)
if(err) return handleError(err);
user = userFound;
);
//what does MongoDb return if it does not find the document?
return user;
但我在这方面遇到了错误:
socialMedias.socialMediaType
那么,我该怎么做这个查询呢?
我试图在 Mongoose 文档中找到,但没有找到。
感谢您的理解。
【问题讨论】:
至少要成为有效的 javascript,您必须引用密钥,因为它不是标识符 --"socialMedias.socialMediaType": socialMediaID
。
但是我不能引用它,因为这个键是由函数接收的。所以它可以是 3 个可能的名称。
为此,对象文字/初始化器不会将键作为变量进行评估。标识符本身的名称成为键。 You'll have to build the object with bracket notation.
好的,我会尝试这样做。只是不知道怎么做,因为我不知道我收到的是哪个词。
在 JavaScript 中,you can use either. 唯一的区别是用于字符串的引号在包含为字符时需要转义 -- 'Joe\'s'
vs "Joe's"
。否则,它们是相同的。
【参考方案1】:
您可能会遇到很多问题。
首先,teams 是一个数组属性,但您要为其分配一个对象。你需要做这样的事情:
var user = new users(
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:[],
socialMedias: [socialMediaType: socialMediaID]
);
其次,如果 socialMediaType 作为函数参数传入,则不能像现在这样使用它。你需要做这样的事情:
var socialMedias = ;
socialMedias[socialMediaType] = socialMediaID;
var user = new users(
userID: id, //give the id of the next user in Dbase
userName: userName,
userEmail: 'userEmail',
teams:[],
socialMedias: [socialMedias]
);
第三,您的 findOne 无法按原样工作。根据我在这里收集到的你的意图,你需要这样的东西:
function searchUser(socialMediaID, socialMediaType)
var user
var query = ;
query["socialMedias."+socialMediaType] = socialMediaID;
users.findOne(query, function(err, userFound)
if(err) return handleError(err);
user = userFound;
);
//what does MongoDb return if it does not find the document?
return user;
但第四,即使这样也行不通,因为您正在从执行异步操作的方法同步返回用户。有多种方法可以解决这个问题,但您可以先阅读有关 Promise 的内容,或将回调函数传递给 searchUser。
【讨论】:
感谢您的回答。我会试试看。 如果可以,您能解释一下为什么“socialMedias”不能像现在这样工作吗? 当你说 users.findOne(socialMedias.socialMediaType: socialMediaID, ...) 时, : 左边的部分是无效的,它需要被引用。但是,我不相信您可以像最初那样直接在匿名对象定义中执行此操作。所以使用临时对象查询来做到这一点。 我的意思是,这是处理您需要在此处完成的异步操作的两种方式。对于承诺,我建议 Q:github.com/kriskowal/q. 你不需要,对于简单的东西,回调可能没问题,但这真的取决于你的设计和偏好。以上是关于如何在 Node.js 中通过 Mongoose 使用 dot(.) 进行查询以及如何添加空数组的主要内容,如果未能解决你的问题,请参考以下文章
Node.js安装教程--windows中通过安装nvmw方式安装管理node
Mongoose(node.js 模块)导致 CPU 使用率高
Mongoose(node.js 模块)导致 CPU 使用率高