【问题标题】:Mongoose get only objects from array matching element inside the objectMongoose 仅​​从对象内的数组匹配元素中获取对象
【发布时间】:2017-04-18 03:50:06
【问题描述】:

我试图通过匹配我传递的fb_id 来获取reviews 数组中的对象。我似乎没有让他们工作。这是我在数据库中的实际文档

{
    "_id": {
        "$oid": "5841d18187dcc74805887a6a"
    },
    "product_id": "583ae172231f5ec01db5727e",
    "category": "Smartphones",
    "reviews": [
        {
            "fb_id": "111",
            "name": "name1",
            "user_img": "imgurl1",
            "title": "asdakj",
            "description": "jnkjnkj",
            "rating": 5,
            "_id": {
                "$oid": "5841d18187dcc74805887a6b"
            }
        },
        {
            "fb_id": "222",
            "name": "name2",
            "user_img": "imgurl2",
            "title": "dadad",
            "description": "asdasdad",
            "rating": 3,
            "_id": {
                "$oid": "5841d1d0cbdf333411530ebd"
            }
        },
        {
            "fb_id": "333",
            "name": "name3",
            "user_img": "img url3",
            "title": "asdad",
            "description": "asdads",
            "rating": 5,
            "_id": {
                "$oid": "5841d4c2174270f807084721"
            }
        },
        {
            "fb_id": "444",
            "name": "name4",
            "user_img": "imgurl4",
            "title": "adasd",
            "description": "kjnkj",
            "rating": 1,
            "_id": {
                "$oid": "5841d569eae1b6600ea1ca92"
            }
        }
    ],
    "__v": 0
}

我将向 mongoose 发送一个 fb_id 的数组,并且只希望数组中包含 fb_id 的对象的结果。

这是我现在的查询:

Review.find({ product_id: '583ae172231f5ec01db5727e' }, { 'reviews.$.fb_id': { $in: <array of fb_id> } }, function(err, results) {
    if (err) {
        throw err;
    };
    console.log(results)

});

但它给了我这个错误:

MongoError: Unsupported projection option: reviews.$.fb_id: { $in: [ 111.0 ] }

编辑:经过一个小查询,现在我要得到一些结果。但结果只有第一个与fb_id 匹配的对象,而不是全部。

请告诉我如何实现这一目标。

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

您可以将其用于reference。 您的代码将是这样的:

Review.find({
    product_id: '583ae172231f5ec01db5727e'
    },
    {
        reviews: {
            $elemMatch: {
                fb_id: {
                    $in: <array of fb_id>
                }
            }
        }
    },
    {
        _id: 0,
        'reviews.$': 1
    }
, function(err, results) {
    if (err) {
        throw err;
    };
    console.log(results)
});

【讨论】:

  • 这仅返回数组中匹配的第一项。它不会返回所有匹配的项目
  • 可能是因为product_id!它应该是独一无二的?!
  • 是的,产品 ID 是唯一的。我希望评论匹配 fb Id 的产品 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2018-11-23
  • 2021-03-13
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多