Arrays Mongoose查询:在数组中查找元素
Mongoose/MongoNoob在此: 我的数据 这是我的简化数据,每个用户都有自己的文档Arrays Mongoose查询:在数组中查找元素,arrays,node.js,mongodb,mongoose,Arrays,Node.js,Mongodb,Mongoose,Mongoose/MongoNoob在此: 我的数据 这是我的简化数据,每个用户都有自己的文档 { "__v" : 1, "_id" : ObjectId( "53440e94c02b3cae81eb0065" ), "email" : "test@test.com", "firstName" : "testFirstName", "inventories" : [ { "_id" : "active", "tags" : [ "inven
{ "__v" : 1,
"_id" : ObjectId( "53440e94c02b3cae81eb0065" ),
"email" : "test@test.com",
"firstName" : "testFirstName",
"inventories" : [
{ "_id" : "active",
"tags" : [
"inventory",
"active",
"vehicles" ],
"title" : "activeInventory",
"vehicles" : [
{ "_id" : ObjectId( "53440e94c02b3cae81eb0069" ),
"tags" : [
"vehicle" ],
"details" : [
{ "_id" : ObjectId( "53440e94c02b3cae81eb0066" ),
"year" : 2007,
"transmission" : "Manual",
"price" : 1000,
"model" : "Firecar",
"mileageReading" : 50000,
"make" : "Bentley",
"interiorColor" : "blue",
"history" : "CarProof",
"exteriorColor" : "blue",
"driveTrain" : "SWD",
"description" : "test vehicle",
"cylinders" : 4,
"mileageType" : "kms" } ] } ] },
{ "title" : "soldInventory",
"_id" : "sold",
"vehicles" : [],
"tags" : [
"inventory",
"sold",
"vehicles" ] },
{ "title" : "deletedInventory",
"_id" : "deleted",
"vehicles" : [],
"tags" : [
"inventory",
"sold",
"vehicles" ] } ] }
如您所见,每个用户都有一个inventory
属性,该属性是一个包含3个清单(activeInventory、soldInventory和deletedInventory)的数组
我的查询
return user
.findOne({email : params.username})
.select('inventories')
.where('title')
.equals('activeInventory')
.select('vehicles')
.id(vehicleID)
.exec(cb)
给定一个用户的电子邮件和一个车辆ID,我希望我的查询能够通过查找用户的activeInventory
,并只返回与ID匹配的车辆。以下是我到目前为止得到的信息:
user = api.mongodb.userModel;
ObjectId = require('mongoose').Types.ObjectId;
return user
.findOne({email : params.username})
.select('inventories')
.find({'title': 'activeInventory'})
//also tried
//.where('title')
//.equals('activeInventory')
.exec(function(err, result){
console.log(err);
console.log(result);
});
这样,结果显示为一个空数组。我还尝试了.find('inventory.title':'activeInventory')
,它奇怪地返回了整个inventory数组。如果可能的话,我希望保留链式查询格式,因为我发现它更具可读性
我的理想查询
return user
.findOne({email : params.username})
.select('inventories')
.where('title')
.equals('activeInventory')
.select('vehicles')
.id(vehicleID)
.exec(cb)
显然,它不起作用,但它可以让您了解我正在尝试做什么。获取链接查询格式。。。我不知道如何解析它,但是,您正在搜索的是投影,您应该看看 可能是这样的:
user.findOne({email: params.username}, {'inventories.title': {$elemMatch: "activeInventory", 'invertories.vehicle.id': $elemMatch: params.vehicleId}, function(err, result) {
console.log(err);
console.log(result);
})
使用“位置”操作符,可以获得结果。但是,如果车辆
数组中有多个元素,则所有元素都将在结果中返回,因为您只能在投影中使用一个位置运算符,并且正在使用两个数组(一个在另一个数组中)
我建议你看一下,因为你会得到更多的灵活性。下面是一个在shell中运行的问题查询示例。我不熟悉猫鼬,但我想这仍然会对你有帮助,你可以翻译它:
db.collection.aggregate([
//仅获取“电子邮件”等于的文档test@test.com“--替换为params.username
{“$match”:{电子邮件:test@test.com"}},
//展开“库存”数组
{“$unwind”:“$Inventory”},
//仅获取“inventory.title”等于“activeInventory”的元素
{“$match”:{“inventory.title”:“activeInventory”},
//展开“车辆”阵列
{“$展开”:“$库存.车辆”},
//按车辆ID筛选--替换为车辆ID
{“$match”:{“inventory.vehicles._id”:ObjectId(“53440e94c02b3cae81eb0069”)},
//整理输出
{“$project”:{{U id:0,车辆:“$inventory.vehicles”}
])
这是您将获得的输出:
{
“结果”:[
{
“车辆”:{
“_id”:ObjectId(“53440e94c02b3cae81eb0069”),
“标签”:[
“车辆”
],
“详情”:[
{
“_id”:ObjectId(“53440e94c02b3cae81eb0066”),
“年份”:2007年,
“变速器”:“手动”,
“价格”:1000美元,
“型号”:“消防车”,
“挤奶头”:50000,
“制造”:“宾利”,
“内饰颜色”:“蓝色”,
“历史”:“停车场”,
“外观颜色”:“蓝色”,
“动力传动系统”:“社会福利署”,
“说明”:“试验车辆”,
“气缸”:4,
“里程类型”:“公里”
}
]
}
}
],
“好”:1
}
我喜欢这种方法,你的方法很好