Mongodb流星查询数组并获取对象

时间:2018-08-03 21:31:26

标签: mongodb meteor

我有一个名为“资源”的集合,其中包含文档:

{
    "_id" : "fGR4ECcw5p2HFgxd3",
    "ownerId" : "J8MpsWChPQdET6jwQ",
    "inventory" : [ 
        {
            "_id" : ObjectId("5b537ef5895adfeae037e0a4"),
            "quantity" : 17
        }, 
        {
            "_id" : ObjectId("5b537d9c895adfeae037dbd2"),
            "quantity" : 6
        }, 
        {
            "_id" : ObjectId("5b5868e081702f675304290e"),
            "quantity" : 26
        }, 
        {
            "_id" : ObjectId("5b5eba8276dd90bd75e27f13"),
            "quantity" : 85
        }, 
        {
            "_id" : ObjectId("5b5ee58176dd90bd75e2f35f"),
            "quantity" : 5
        }, 
        {
            "_id" : ObjectId("5b62275686f92e050a9d50b2"),
            "quantity" : 3
        }
    ]
}

我想做的是获取具有该对象ID的库存阵列对象

我觉得这应该可行,但不可行

Resources.findOne({ownerId:userid,"inventory._id":ObjectId})

例如,我的预期输出:

 {
            "_id" : ObjectId("5b537ef5895adfeae037e0a4"),
            "quantity" : 17
        } 

我也尝试过:

 console.log(Resources.findOne({ownerId:userid},{fields:{inventory:{$elemMatch:{_id:ids[i]}}}}));

3 个答案:

答案 0 :(得分:1)

您可以根据文档使用MongoDB aggregations

  

聚合操作处理数据记录并返回计算结果。聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。

请确保流星具有proper interface to MongoDB aggregations,即Resources.aggregate

以后的mongo shell查询在我的机器上可以使用您提到的文档。

db.test.aggregate([
    {
        $match: {
            ownerId: "J8MpsWChPQdET6jwQ",
            inventory: {
                $elemMatch: {
                    "_id": ObjectId("5b537ef5895adfeae037e0a4")
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            inventory: 1
        }
    },
    {
        $project: {
            result:
            {
                $arrayElemAt: [
                    {
                        $filter: {
                            input: "$inventory",
                            as: "product",
                            cond: {
                                $eq: [
                                    "$$product._id",
                                    ObjectId("5b537ef5895adfeae037e0a4")
                                ]
                            }
                        }
                    },
                    0
                ]
            }
        }
    }
])

结果是:

{
        "result" : {
                "_id" : ObjectId("5b537ef5895adfeae037e0a4"),
                "quantity" : 17
        }
}

答案 1 :(得分:1)

假设您只想访问该数据,这是一种更简单的方法。

您可以获取资源,然后遍历资源清单并找到所需的对象。

尝试类似这样的方法(userId和objectId是您的输入/搜索变量。我也用驼峰式将它们括起来):

var userId = "some id";
var objectId = "some id";

var resource = Resources.findOne({"ownerId": userId});
var inventory = resource.inventory;

var output = {};

for(var i = 0; i < inventory.length; i++) {
  if(inventory[i]._id == objectId) {
    output = inventory[i];
  }
}

答案 2 :(得分:1)

您可以尝试

db.collection.find({
  "ownerId": "J8MpsWChPQdET6jwQ"
},
{
  "inventory": {
    "$elemMatch": {
      "_id": ObjectId("5b537ef5895adfeae037e0a4")
    }
  }
})

尝试here