gpt4 book ai didi

node.js - Mongoose Mongodb 查询对象数组

转载 作者:IT老高 更新时间:2023-10-28 13:11:27 32 4
gpt4 key购买 nike

在使用 Mongoose 查询数组时,我很难得到我期望看到的结果。一个用户可以有许多与他/她的帐户相关联的房间。房间对象存储在集合中附加到用户的数组中。只有一个集合称为用户。

考虑用户和房间的以下两种模式:

用户架构

var userSchema = mongoose.Schema({

local : {
username : String,
email : String,
password : String,
rooms : {type:Array, default: []}
}


});

房间架构

var roomSchema = mongoose.Schema({

name: String

});

这是我尝试过的查询:

var User = require('../models/user');

User.find({ 'rooms.name' : req.body.username },
{ rooms:
{ $elemMatch :
{
name: req.body.username
}
}
}, function (err, user) {

if (err){
return done(err);
}

console.log("user:::", user);

if (user) {
console.log("ROOM NAME FOUND");
req.roomNameAlreadyInUse = true;
next();

} else {
req.roomNameAlreadyInUse = false;
console.log("ROOM NAME NOT FOUND");
next();

}

});

问题是这个查询似乎总是返回一个空数组,即使它应该包含一些东西或者它应该什么也不返回。那么如何搜索所有用户房间数组以查看房间名称是否已经存在?

我也尝试了以下查询,但都没有成功:

User.find({local: {rooms: {$elemMatch: {name: req.body.username}}}}, function (err,     user) {

}



User.find({'local.rooms': {$elemMatch: {name: req.body.username}}}, function (err, user) {

}

我还应该指出,数据库已填充,因为我可以在 robomongo 中看到数组(在创建用户帐户时创建了 1 个元素)。

正在填充来自控制台输出的示例数据以显示数据库(包括 user.rooms 数组):

db.users.find() { "_id" : ObjectId("533c4db2b2c311a81be8a256"), "local" : { "password" : "$2a$08$0yQQJ2y0726kZtkWY5mAPOgZhacOmZn0Fd8DlausiuMB XE4ZblTXS", "username" : "paul", "email" : "test", "rooms" : [ { "name" : "paul", "id" : ObjectId("533c4db2b2c311a81be8a2 57") } ], "status" : "active" }, "_v" : 0 } { "_id" : ObjectId("533c4ddab2c311a81be8a258"), "local" : { "password" : "$2a$08$dC3CbDTkG5ozECDTu/IicO3Az0WdkzlGh2xDcb8j1CF/ FQhe5guZq", "username" : "john", "email" : "test2", "rooms" : [ { "name" : "john", "id" : ObjectId("533c4ddab2c311a81be8a 259") } ], "status" : "active" }, "_v" : 0 }

最佳答案

我将其更改为使用 findOne 而不是 find,它现在可以工作了。我不太确定为什么这会有所作为。这是我使用的 findOne 函数:

User.findOne({'local.rooms': {$elemMatch: {name: req.body.username}}}, function (err, user) {

if (err){
return done(err);
}

if (user) {
console.log("ROOM NAME FOUND");
req.roomNameAlreadyInUse = true;
next();

} else {
req.roomNameAlreadyInUse = false;
console.log("ROOM NAME NOT FOUND");
next();

}

});

关于node.js - Mongoose Mongodb 查询对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22806326/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com