我的文档具有以下结构:
{
"sku": "x",
"prices": [{"code": 1}, {"code": 2}, {"code": 3}]
}
我正在尝试仅查询价格数组中具有代码1或3的对象。
db.my_coll.find({
sku: "x"
}, {
_id: 0,
prices: {
$elemMatch: {
$or: [{code: 1}, {code: 3}]
}
}
})
但是结果只检索code
1:
{ "prices" : [ {"code" : 1} ] }
结果应为:
{ "prices" : [ {"code" : 1}, {"code": 3} ] }
我怎样才能只获得数组中的特定对象?
价格数组包含很多对象(至少100个)
答案 0 :(得分:0)
$elemMatch仅返回第一个匹配的元素,您可以将$filter与$match一起使用:
db.my_coll.aggregate([
{
$match: { sku: "x" }
},
{
$project: {
_id: 0,
prices: {
$filter: {
input: "$prices",
cond: {
$in: [ "$$this.code", [ 1, 3 ] ]
}
}
}
}
},
{
$match: {
prices: { $ne: [] } // if you don't want to get empty arrays in result set
}
}
])
答案 1 :(得分:0)
另一种更老套的方法,并且如果您没有App.messages = App.cable.subscriptions.create { channel: "MessagesChannel", id: <%= params[:id] %> },
connected: ->
# ...
# ...
版本(由于引入了$filter,则通过$ unwind / $ match / $ group和$ project:>
MongoDB 3.2
您可以在此处查看结果:https://mongoplayground.net/p/JQ4xRomk3VM
db.my_coll.aggregate([
{
$unwind: "$prices"
},
{
$match: {
sku: "x",
"prices.code": {
$in: [
1,
3
]
}
}
},
{
$group: {
_id: "$_id",
prices: {
$push: "$prices"
}
}
},
{
$project: {
_id: 0,
prices: 1
}
}
])
的总体方法似乎是您在mickl
及更高级别上想要的。