获取集合中与特定数组元素内容匹配的所有文档中的数组元素

时间:2018-01-24 16:26:26

标签: node.js mongodb

我的MongoDB中有以下文档结构,我正在尝试返回包含itemID" 5a59c587fa9b4a212b0a1312"的所有价格的对象数组。使用以下查询跨所有文档但不幸的是它总是返回一个空数组。有人可以在这里建议我可能做错了吗?以及如何得到这样的结果?

注意:我在Node.js应用中使用promised-mongo来访问我的MongoDB

我试过查询:

{ transDetails: { $elemMatch: { itemID: "5a59c587fa9b4a212b0a1312" } } }

数据库样本:

{
    "_id" : ObjectId("5a688e7ea52deb6d4a6b6663"),
    "transactionID" : "1",
    "transDetails" : [ 
        {
            "itemID" : "5a59c587fa9b4a212b0a1312",
            "price" : "22"
        }, 
        {
            "itemID" : "5a59c95b081c6c612bd17058",
            "price" : "24"
        }
    ] }

{
    "_id" : ObjectId("5a6aa99a52deb6d4a67714"),
    "transactionID" : "2",
    "transDetails" : [ 
        {
            "itemID" : "5a59c587fa9b4a212b0a1312",
            "price" : "35"
        }, 
        {
            "itemID" : "5a59c95b081c6c612bd17058",
            "price" : "24"
        }
    ] }

1 个答案:

答案 0 :(得分:0)

使用投影查找只有transDetails中匹配的项目:

.find({"transDetails.itemID": "5a59c587fa9b4a212b0a1312"}, {_id:0, "transDetails.$": 1})

将返回

{
    "transDetails" : [ 
        {
            "itemID" : "5a59c587fa9b4a212b0a1312",
            "price" : "22"
        }
    ] 
},
{
    "transDetails" : [ 
        {
            "itemID" : "5a59c587fa9b4a212b0a1312",
            "price" : "35"
        }
    ] 
},
....

希望您重新塑造文档,可以使用聚合:

.aggregate([
    { $match: { "transDetails.itemID": "5a59c587fa9b4a212b0a1312" } },
    { $project: {
        _id: 0,
        transDetails: {
            $filter: {
               input: "$transDetails",
               as: "item",
               cond: { $eq: [ "$$item.itemID", "5a59c587fa9b4a212b0a1312" ] }
            }
         }
    } },
    { $unwind: "$transDetails"},
    { $project: {price: "$transDetails.price"}}
])

哪个会给你

{
    "price" : "22"
},
{
    "price" : "35"
},
...