Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Mongoose查询:在数组中查找元素_Arrays_Node.js_Mongodb_Mongoose - Fatal编程技术网

Arrays Mongoose查询:在数组中查找元素

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

Mongoose/MongoNoob在此:

我的数据

这是我的简化数据,每个用户都有自己的文档

{ "__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
}

我喜欢这种方法,你的方法很好