删除与某些字段相同的文档

时间:2019-03-08 21:50:20

标签: javascript mongodb

我在MongoDB中有一个数据,我想删除所有重复的文档。问题是MongoDB为每个项目分配了唯一的_id,所以我不能只删除重复的项目。每个文档中都有一个名为name的字段,并且我想删除具有相同name的项目。 例如:

[{_id: 5c7e423f0bdaa9aeb5399e90,
name ="A"
grade = 16
enrolled ="dddh"
},

{_id: 5c7e423f1bdaa9aeb5399e90,
key ="B"
grade =17
note ="ddddd"
},

{_id: 5c7e423d0bdaa9aeb5399e90,
key ="B"
score =17
note ="ddddd"
}]

收件人:

[{_id: 5c7e423f0bdaa9aeb5399e90,
name ="A"
grade = 16
enrolled ="dddh"
},

{_id: 5c7e423f1bdaa9aeb5399e90,
name ="B"
grade =17
enrolled ="ddddd"
}]

列表可能很大,所以有什么有效的方法吗?

1 个答案:

答案 0 :(得分:0)

首先请注意,您的结构包含许多语法错误。现在,一种解决方案是在原始对象数组上使用Array.reduce()并使用<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/summaryAppBar" android:layout_width="match_parent" android:layout_height="wrap_content"> <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/main.collapsing" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> <LinearLayout android:layout_width="match_parent" android:layout_height="256dp" android:background="@drawable/beach" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.3" /> <!-- This is sticky header--> <androidx.appcompat.widget.Toolbar android:id="@+id/summaryToolBar" android:layout_width="match_parent" android:layout_height="72dp" android:layout_gravity="center" android:background="@android:color/white" android:padding="@dimen/common_layout_margin" android:visibility="visible" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" android:textSize="24sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="Offer" android:textSize="24sp" /> </FrameLayout> </androidx.appcompat.widget.Toolbar> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <!-- Bottom margin if I do't use then it does not display last child item. Wired but true in this case--> <!-- Removed following: --> <!--android:layout_marginBottom="72dp"--> <androidx.core.widget.NestedScrollView android:id="@+id/nestedScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="72dp" android:background="@android:color/holo_blue_light" android:visibility="visible" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:layout_insetEdge="bottom" tools:listItem="@layout/item_dessert"> <LinearLayout android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="A TextView" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="A TextView" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="A TextView" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="A TextView" /> </LinearLayout> </androidx.core.widget.NestedScrollView> </androidx.coordinatorlayout.widget.CoordinatorLayout> 属性作为此新对象的object来生成新的name。这样可以确保每个keys属性仅关联一个对象。最后,您可以使用Object.values()获得所需的输出。

name
let input = [
  {
    _id: "5c7e423f0bdaa9aeb5399e90",
    name: "A",
    grade: 16,
    enrolled: "dddh"
  },
  {
    _id: "5c7e423f1bdaa9aeb5399e90",
     name: "B",
     grade: 17,
     note: "ddddd"
  },
  {
    _id: "5c7e423d0bdaa9aeb5399e90",
    name: "B",
    score: 17,
    note: "ddddd"
  }
];

let res = input.reduce((acc, curr) =>
{
    acc[curr.name] = acc[curr.name] || curr;
    return acc;
}, {});

console.log(Object.values(res));