如何以任何顺序检索与数组项目匹配的Mongo集合



考虑以下存储在stocks集合上的mongo文档:

{
    "_id" : ObjectId("5d14eb6e7a99c30956b842e1"),
    "propertiesValues" : [
        {
            "property_id" : "5c5460604bb12b02277f26d5",
            "value" : "SEMI FOSCO"
        },
        {
            "property_id" : "5c38bb491cddf30213c2fb13",
            "value" : "LL"
        },
        {
            "property_id" : "5ba9304f13a60b02f1b5d2c1",
            "value" : "GARGOYLE"
        },
        {
            "property_id" : "5c38bbf01cddf30213c2fb17",
            "value" : "7/8 pes"
        },
        {
            "property_id" : "5c545ecd4bb12b02277f26ca",
            "value" : "VESTUÁRIO"
        }
    ],
    "materialDefinition_id" : ObjectId("5b68b9d1a4e46302c325e01e"),
    "deletedAt" : null,
    "createdAt" : 1561652078846,
    "__v" : 0
}

为什么给定查询返回没有字段:

db.stocks.find({ propertiesValues: [ { property_id: '5ba9304f13a60b02f1b5d2c1', value: 'GARGOYLE' }, { property_id: '5c38bb491cddf30213c2fb13', value: 'LL' }, { property_id: '5c38bbf01cddf30213c2fb17', value: '7/8 pes' }, { property_id: '5c545ecd4bb12b02277f26ca', value: 'VESTUÁRIO' }, { property_id: '5c5460604bb12b02277f26d5', value: 'SEMI FOSCO' } ] },{}).pretty();

我期望用给定查询检索给定的文档,但它没有重新调整数据。

如何正确解决该问题(propertiesValue可能以任何顺序发生,因此该解决方案必须能够以存储的任何顺序返回确切的项目(

编辑

以下查询返回请求的数据:

db.stocks.find({ propertiesValues: [ { property_id: '5c5460604bb12b02277f26d5', value: 'SEMI FOSCO' }, { property_id: '5c38bb491cddf30213c2fb13', value: 'LL' },  { property_id: '5ba9304f13a60b02f1b5d2c1', value: 'GARGOYLE' },  { property_id: '5c38bbf01cddf30213c2fb17', value: '7/8 pes' },  { property_id: '5c545ecd4bb12b02277f26ca', value: 'VESTUÁRIO' }] },{}).pretty();

区别在于,此Lask查询按文档的确切顺序。

这对我不起作用,因为我不能保证查询参数的顺序,因此我需要一个遵守以下条件的解决方案:

有效返回

  • 如果在此处都有所有必需的propertiesValues,请返回数据
  • 如果有不同顺序所需的propertiesValues,请返回数据

无效返回

  • 如果propertiesValues中有或多或少的元素,则不会返回数据
  • 如果任何元素内容(property_idvalue(不同,则不会返回数据

换句话说,无论它们发生什么顺序,我都需要property_idvalue字段的确切匹配。

首先,您在描述文档时指定的集合以及您要查询的集合不同。

前进,您可以将所有操作员用于查询。

db.collection.find({ propertiesValues: { "$all": [ { property_id: '5ba9304f13a60b02f1b5d2c1', value: 'GARGOYLE' }, { property_id: '5c38bb491cddf30213c2fb13', value: 'LL' }, { property_id: '5c38bbf01cddf30213c2fb17', value: '7/8 pes' }, { property_id: '5c545ecd4bb12b02277f26ca', value: 'VESTUÁRIO' }, { property_id: '5c5460604bb12b02277f26d5', value: 'SEMI FOSCO' } ] }}).pretty();

它将以任何顺序与文档匹配。

mongodb文档:https://docs.mongodb.com/manual/reference/poerator/query/query/all/

您应该以$ like尝试尝试:

{ "propertiesValues": { "$size" : 5, "$all": [ { property_id: '5ba9304f13a60b02f1b5d2c1', value: 'GARGOYLE' }, { property_id: '5c38bb491cddf30213c2fb13', value: 'LL' }, { property_id: '5c38bbf01cddf30213c2fb17', value: '7/8 pes' }, { property_id: '5c545ecd4bb12b02277f26ca', value: 'VESTUÁRIO' }, { property_id: '5c5460604bb12b02277f26d5', value: 'SEMI FOSCO' } ]  }}

添加$大小检查保证确切的匹配。

最新更新