我有一个包含以下条目的集合:
{
"userid": 1,
"contents": [
{ "tag": "whatever", "value": 100 },
{"tag": "whatever2", "value": 110 }
]
}
我希望能够查询该集合并仅返回数组的一部分:与查询匹配的部分。我正在尝试使用$ positional运算符来执行此操作,但到目前为止它还没有工作。
更准确地说,我想做的是:
collection.find({'contents.tag':"whatever"},{'contents.$.value':1})
结果我希望只有与数组中与查询匹配的条目对应的值,在这种情况下为100。
你知道什么是错的吗?我在想,也许$运算符只能用于更新而不能用于查询。有人知道吗?
谢谢!
答案 0 :(得分:8)
是的,你是对的 - 位置运算符用于更新对象。
现在的解决方案是返回数组,在应用程序中拉出字段。
此功能有一个开放的增强请求(在查询中):
https://jira.mongodb.org/browse/SERVER-828
有关位置运算符的更多信息,请参阅:
http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
答案 1 :(得分:8)
您正在寻找的是$elemMatch运营商。
答案 2 :(得分:0)
这可能是一种矫枉过正,但我猜你可以使用map-reduce。
首先,使用查询进行预过滤,在map中发出所有数组元素,过滤那些在emit或reduce中不匹配的元素。如果你没有说明一切都会发生在RAM中。
如果必须经常运行这些类型的查询,则复制数据可能是值得的。
尽管如此,我希望SERVER-828能尽快实施!
答案 3 :(得分:0)
使用$ in创建一个查询,并将相等的值添加到数组中,这可以解决您的问题
$users_array = array(xxxxxxxx,yyyyyy);
$user = Db::find('fb_users', array(
'facebook_id' => array(
'$in' => array($users_array)
)
));