Mongodb 如何以任意顺序检索与数组项匹配的mongo集合?
考虑存储在Mongodb 如何以任意顺序检索与数组项匹配的mongo集合?,mongodb,mongoose,Mongodb,Mongoose,考虑存储在stocks集合中的以下mongo文档: { "_id" : ObjectId("5d14eb6e7a99c30956b842e1"), "propertiesValues" : [ { "property_id" : "5c5460604bb12b02277f26d5", "value" : "SEMI FOSCO" }, { "property_i
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查询与文档的顺序完全相同
这不适用于我,因为我无法保证查询参数的顺序,因此我需要一个符合以下条件的解决方案:
有效退货
- 如果中包含所有必需的
,请返回数据属性值
- 如果以不同的顺序存在所有必需的
,请返回数据属性值
- 如果
中有更多或更少的元素,则不返回数据属性值
- 如果任何元素内容(
或property\u id
)不同,则不返回数据value
换句话说,我需要
property\u id
和value
字段的精确匹配,无论它们以何种顺序出现。首先,您在描述文档时指定的集合与您查询的集合是不同的
接下来,您可以使用$all运算符进行查询
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文档:首先,您在描述文档时指定的集合与您要查询的集合不同 接下来,您可以使用$all运算符进行查询
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文档:您应该使用$all进行尝试,如下所示:
{ "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' } ] }}
添加$size复选框可确保精确匹配。您应该使用$all进行尝试,如下所示:
{ "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' } ] }}
添加$size复选框可确保完全匹配。是否有可能只是使用了错误的集合?您在订单上声明了它,但查询显示您使用stocksTypo。更正。您是否有可能只是使用了错误的收藏?您在订单上声明了它,但查询显示您使用stocksTypo。更正。