从集合mongoDB中的数组查询文档

时间:2019-01-21 20:33:31

标签: mongodb mongoose nosql mongodb-query

我正试图从MongoDB的集合中获取数据,我具有以下结构:

check JSON structure here.

因此,基本上我想做的事情是,例如,以<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/scrollView2" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" tools:context=".MainActivity" > <android.support.constraint.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/idbutton1" android:layout_width="0dp" android:layout_height="0dp" android:background="#f0eb79" android:foreground="?attr/selectableItemBackground" android:padding="25dp" android:text="BUTTON1" android:textAllCaps="false" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toTopOf="@+id/idbutton3" app:layout_constraintEnd_toStartOf="@+id/idbutton2" app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/idbutton2" android:layout_width="0dp" android:layout_height="0dp" android:background="#000" android:foreground="?attr/selectableItemBackground" android:padding="25dp" android:text="BUTTON2" android:textAllCaps="false" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toTopOf="@+id/idbutton4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/idbutton1" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/idbutton3" android:layout_width="0dp" android:layout_height="0dp" android:background="#f0eb79" android:foreground="?attr/selectableItemBackground" android:padding="25dp" android:text="BUTTON3" android:textAllCaps="false" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toTopOf="@+id/idbutton5" app:layout_constraintEnd_toStartOf="@+id/idbutton4" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/idbutton1" /> <Button android:id="@+id/idbutton4" android:layout_width="0dp" android:layout_height="0dp" android:background="#000" android:foreground="?attr/selectableItemBackground" android:padding="25dp" android:text="BUTTON4" android:textAllCaps="false" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toTopOf="@+id/idAppointments" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/idbutton3" app:layout_constraintTop_toBottomOf="@+id/idbutton2" /> <Button android:id="@+id/idbutton5" android:layout_width="0dp" android:layout_height="0dp" android:background="#f0eb79" android:foreground="?attr/selectableItemBackground" android:padding="25dp" android:text="BUTTON5" android:textAllCaps="false" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/idAppointments" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/idbutton3" /> <Button android:id="@+id/idAppointments" android:layout_width="0dp" android:layout_height="0dp" android:background="#000" android:foreground="?attr/selectableItemBackground" android:padding="25dp" android:text="BUTTON6" android:textAllCaps="false" android:textColor="#ffffff" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/idbutton5" app:layout_constraintTop_toBottomOf="@+id/idbutton4" /> </android.support.constraint.ConstraintLayout> id: 456到最高events为== 2的对象为目标,并仅返回该对象。

我已经尝试过_idaggregate(),但是它们都无法按照我想要的方式工作...任何帮助将不胜感激。

我尝试过的示例:

findOne()

我无法更改以下结构,因为顶级_id实际上是userId,并且我想使用_id来获取用户的所有事件:例如“ 2”。

1 个答案:

答案 0 :(得分:1)

您可以先使用_id进行过滤,以尽可能地过滤掉。然后,您可以使用$unwind获取每个文档的单个事件,并为嵌套_id应用另一个匹配项。在最后一步中,您可以使用$replaceRoot仅获取嵌套文档,请尝试:

Model.aggregate([
    { $match: { _id: "2" } },
    { $unwind: "$events" },
    { $match: { "events._id": "456" } },
    { $replaceRoot: { newRoot: "$events" } } 
])

输出:

{ "_id" : "456", "name" : "eventName_1" }